Bash
$@ 變數不在 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 }
問題在於您的 for 循環中使用不正確
exit 127
,該循環在第一次 for 循環迭代後退出。您需要將echo
語句和exit
作為複合塊分組{..}
以防止這種情況發生。echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }
如果沒有此分組,則所
||
定義的僅適用於命令echo
,並且無論重定向到文件是否通過或失敗,都始終執行該命令,因為您在那裡定義了命令分隔符。exit``;
現在啟用複合分組,內部的整個操作集
{..}
被視為一個塊,如果寫入操作USERS.txt
失敗,它們都會執行。