【问题标题】:Linux bash script - For loops issuesLinux bash 脚本 - For 循环问题
【发布时间】:2015-04-10 15:01:24
【问题描述】:

我正在编写一个 bash 脚本,该脚本将在批处理过程中添加用户。这段代码如下:

#!/bin/bash
# A script that creates users.

echo "This is a script to create new users on this system."
echo "How many users do you want to add?"
read am
echo " "

for i in {0..$am..1}
do
    echo "Enter a username below:"
    read usern
    sudo useradd $usern

    sudo passwd $usern

    echo " "
    echo "User $am '$usern' added."
done

在这种情况下,我想创建 4 个用户。我通过并输入用户名“callum3”并将密码设置为“1234”以便于登录。一旦我输入所有内容(正确,我可以添加),终端窗口将显示以下内容。

User 4 'callum3' added.

这表明我的 for 循环实际上并没有工作,而我看不出它有什么问题。我尝试过使用 while 循环,但也没有运气。

我在这里犯了一个新手错误还是有更深层次的事情发生?

【问题讨论】:

    标签: linux bash shell scripting


    【解决方案1】:

    虽然我对此有所怀疑,但为了更好地了解您的脚本可能出现的问题,我将其粘贴在 shellcheck.net 中。问题出在这条线上:

    for i in {0..$am..1}
    

    Bash 不支持大括号范围扩展中的变量。也就是说,您不能在 {..} 这样的表达式中使用变量。

    改为使用seq。使用seq $var,您可以获得从 1(默认)到 $var 的序列:

    for i in $(seq "$am")
    

    【讨论】:

    • 这非常有效!谢谢,这让我困惑了一段时间。
    • 很高兴看到这个问题:) 这不是很明显,除非你以前遇到过这个问题!
    • @CallumWale 如果您在发布的 sn-p 上运行 shellcheck,也会自动指出
    • 感谢您指出这一点,其他人 :) 我不知道这样的事情存在。
    • 当然。我只是为了 OP 的未来方便。
    【解决方案2】:

    我觉得我错过了一些没有人建议使用算术 for 循环的东西:

    for ((i=0; i<am; i++)); do
        …
    done
    

    这在 bash 中具有特别的好处,即可读且不需要子 shell。

    【讨论】:

      【解决方案3】:

      你可以使用:

      for i in `seq 0 $((am-1))`
      do
      ...
      done
      

      序列将从 0 开始,到 $am-1 结束

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2013-11-07
        • 1970-01-01
        相关资源
        最近更新 更多