问题:
我无法让$@
变量在 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
无论重定向到文件是否通过或失败,都运行命令,因为您;
在那里定义了命令分隔符。
现在,启用复合分组后,内部的整套操作{..}
将被视为一个块,并且如果写入操作USERS.txt
失败,则这两个操作都会被执行。