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