Bash

$@ 變數不在 for 循環中工作,試圖遍歷使用者列表

  • October 18, 2018

問題:

我無法讓$@變數在 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失敗,它們都會執行。

引用自:https://unix.stackexchange.com/questions/476193