【问题标题】:How to echo arguments in loop in bash如何在bash的循环中回显参数
【发布时间】:2014-05-06 08:17:40
【问题描述】:

我有一个 bash 应该以这种方式运行:

./script.sh <arg1> <arg2> <arg3>...<argn>

我想在我的 bash 中显示这些参数:

<arg3> <arg4> ... <argn>

所以我写了这个 bash:

for (( i=1; i<=$#-3; i++ ))
do
    echo $((3+i))
done

但它显示了参数的数量。

如何输入# 才能看到我的真实参数?

谢谢

【问题讨论】:

标签: linux bash loops arguments


【解决方案1】:

如果你想显示从 arg3 开始的参数,你可以简单地使用

echo "${@:3}" # OR
printf "%s\n" "${@:3}"

如果您真的想显示参数索引,请使用

for (( i=3; i < $#; i++)); do 
    echo $i
done

【讨论】:

    【解决方案2】:

    您可以将所有参数存储在 BASH 数组中,然后将它们用于以后的处理:

    args=( "$@" )
    for (( i=2; i<${#args[@]}; i++ ))
    do
        echo "arg # $((i+1)) :: ${args[$i]}"
    done
    

    【讨论】:

      【解决方案3】:

      无需数学即可显示所需参数的最小解决方案:

      shift 2
      for word
      do
        echo ${word} 
      done
      

      【讨论】:

        【解决方案4】:

        我更喜欢@anubhava 将参数存储在数组中的解决方案,但要使您的原始代码正常工作,您可以使用eval

        for ((i=1;i<=$#;i++)); do
            eval echo "\$$i"
        done
        

        【讨论】:

        • 你的意思是使用 C 风格的 for 循环吗?
        • 用 c 风格和我写的-3..谢谢,我的问题是:echo $((3+i))
        • echo ${!i}bash 中执行间接参数扩展比使用eval 更好。
        【解决方案5】:

        在您给出所有好的答案后,我发现这个解决方案非常适合我的主题:

        ARG=( $(echo "${@:3}") )
        for (( i=1; i<=$#-3; i++ ))
        do
            echo ${ARG[i]}
        done
        

        【讨论】:

        • 如果您接受另一个答案,则无需发布单独的答案。
        猜你喜欢
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 2018-01-15
        • 2013-09-23
        • 2017-02-26
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        相关资源
        最近更新 更多