$ @変数はforループでは機能しません。ユーザーリストを繰り返してみてください。

$ @変数はforループでは機能しません。ユーザーリストを繰り返してみてください。

質問:

$@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 127forループが誤って使用され、最初のforループの反復後に終了することです。これを防ぐには、echoステートメントをグループ化してexit複合ブロックにまとめる必要があります。{..}

echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }

||そのようなグループ化がないと、定義が適用されます。ただコマンドechoいつもexit;コマンド区切り文字を定義したため、ファイルへのリダイレクトが成功したか失敗したかにかかわらず、コマンドが実行されます。

これで複合グループ化が有効になっていると、内部のワークセット全体が1つの{..}ブロックとして処理され、書き込み操作がUSERS.txt失敗した場合は両方のタスクが実行されます。

おすすめ記事