質問:
$@
forループで目的の操作を実行するための変数を取得できません。ループはループを回すときにファイルに名前だけを送信し、すべてのパラメータを繰り返してUSERS.txt
ファイルに個別に書き込む必要があります。
ファイルは次のようになります。
something78
something79
something7
dagny
oli
bjarni
toti
stefan_hlynur
jessie
テストコードは次のとおりです。
#!/bin/bash
prepare_USERS()
{
/usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > USERS.txt
/bin/chmod 777 USERS.txt
echo "$@"
for user in "$@"
do
echo $user
echo "$user" >> USERS.txt || echo "writing to USERS.txt failed"; exit 127
done
}
prepare_USERS "$@"
#for user in "$@"
#do
# echo "$user" >> USERS.txt
#done
for user in USERS.txt
do
printf "%s" $user
done
私が渡した引数は次のとおりです。
./somethingDELETEme.sh jessie henry allison jason
現在の出力:
$./somethingDELETEme.sh jessie henry allison jason
jessie henry allison jason
jessie
予想出力:
このループは、パラメータリストのすべての名前を繰り返しファイルに書き込みますUSERS.txt
。
質問:
以前はこの変数()を使用したことがありますが、$@
この問題は発生しませんでした。
ループがパラメータ$@
リスト()のすべての名前を繰り返さないのはなぜですか?正しくコーディングする方法は何ですか?
実際のコードは次のとおりです。
prepare_USERS()
{
checkIfUser
/usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > "$CURRENTDIR"/USERS.txt
/bin/chmod 777 "CURRENTDIR"/USERS.txt
for user in "$@"
do
echo "$user" >> "CURRENTDIR"/USERS.txt || echo "writing to USERS.txt failed"; exit 127
done
}
答え1
問題は、exit 127
forループが誤って使用され、最初のforループの反復後に終了することです。これを防ぐには、echo
ステートメントをグループ化してexit
複合ブロックにまとめる必要があります。{..}
echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }
||
そのようなグループ化がないと、定義が適用されます。ただコマンドecho
といつもexit
;
コマンド区切り文字を定義したため、ファイルへのリダイレクトが成功したか失敗したかにかかわらず、コマンドが実行されます。
これで複合グループ化が有効になっていると、内部のワークセット全体が1つの{..}
ブロックとして処理され、書き込み操作がUSERS.txt
失敗した場合は両方のタスクが実行されます。