whileループとforループが異なる動作をするのはなぜですか?

whileループとforループが異なる動作をするのはなぜですか?

ファイルからユーザーとサーバーの詳細を読み取り、tempo.txt別のスクリプトを使用してその unix アカウントでファイルシステムのディスク容量を確認しようとしますserver_disk_space.sh。しかし、なぜwhileループは最初の行でのみ機能し、forループはうまく機能するのかわかりません。これを理解するのを手伝ってください。

whileループの使用

#!/usr/bin/ksh
while read line
do
r1=`echo $line | cut -d"#" -f1`;
r2=`echo $line | cut -d"#" -f2`;
apx_server_disk_space.sh $r2 $r1
done<tempo.txt

出力

8

forループの使用

#!/usr/bin/ksh
for line in $(cat tempo.txt)
do
r1=`echo $line | cut -d"#" -f1`;
r2=`echo $line | cut -d"#" -f2`;
apx_server_disk_space.sh $r2 $r1
done

出力

8
23
54
89
12

コンテンツserver_disk_space.sh

#!/usr/bin/ksh
user=$1
server=$2
count=`ssh ${user}@${server} "df -h ."`
echo ${count} | awk '{print $12}' | tr -d %

Use percentage上記のスクリプトは、すべてのサーバーのディスク使用量の値を出力します。


コンテンツtempo.txt

abclin542#abcwrk47#
abclin540#abcwrk1#
abclin541#abcwrk2#
abclin543#abcwrk3#
abclin544#abcwrk33#

答え1

-nオプションを追加しない限り、ssh標準ssh入力から読み取られます。 while ループの場合は tempo.txt ファイルです。

また、別のファイル記述子を使用して tempo.txt ファイルを読み取ることもできます。

#! /usr/bin/ksh -
while IFS='#' read <&3 -r r1 r2 rest; do
  apx_server_disk_space.sh "$r2" "$r1"
done 3< tempo.txt

これらのサーバーがGNU / Linuxサーバーの場合、SSHスクリプトは次のようになります。

#! /bin/sh -
ssh -n "$1@$2" 'stat -fc "scale=2;100*(1-%a/%b)" .' | bc

これはより強力で未来志向の可能性があります。

関連情報