$@ 变量在 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无论重定向到文件是否通过或失败,都运行命令,因为您;在那里定义了命令分隔符。

现在,启用复合分组后,内部的整套操作{..}将被视为一个块,并且如果写入操作USERS.txt失败,则这两个操作都会被执行。

相关内容