【问题标题】:Looping through parameters of a function in bash, how to check for condition on the ordinal number of the parameter?循环遍历bash中函数的参数,如何检查参数序号的条件?
【发布时间】:2014-09-30 16:26:28
【问题描述】:

我在 bash 中有一个接受参数的函数,我想提取除第一个参数之外的所有参数。

我正在尝试这个

alias save=save
save(){
    for i in "$@"; do 
        if [ i -gt 1 ]
        then
            echo $i
        fi
    done
}

但它给出了错误

sh.exe": [: i: 期望的整数表达式

我知道$i 是参数本身,所以这样做

if [ $i -gt 1 ]

给出错误

$ 保存你好你好
sh.exe": [: hi: 预期的整数表达式
sh.exe": [: hola: 需要整数表达式

如果$i 是参数本身,而i 不能作为变量工作,那么它还能如何工作?

【问题讨论】:

  • if [ $i -gt 1 ] ...即$i 而不仅仅是i
  • @fedorqui $i 是参数本身。它给出错误(检查更新)

标签: bash if-statement for-loop


【解决方案1】:

先换班,去掉第一个 arg。这样就不需要循环体中的条件,也可以将for i in "$@"简化为for i;,像这样:

save() {
    shift
    for i; do 
        echo $i
    done
}

【讨论】:

    【解决方案2】:

    不幸的是,不能将索引与参数数组 $@$* 一起使用,你会得到一个错误的替换错误

    但是您可以将它分配给另一个数组并像这样使用索引

     declare -a ARRAY=("$@")
     for ((i=1; i< ${#ARRAY[@]};i++ )) ; do
            echo "${ARRAY[$i]}"
     done
    

    请注意,您在$i 中有索引

    【讨论】:

      【解决方案3】:

      在 Bash 中执行此操作的方法是 "${@:2}",这使得多元素扩展从第二个参数开始。这使得shift 的使用没有必要。如果需要,您仍然可以访问第一个参数。

      save() {
          for i in "${@:2}"; do 
              echo "$i"
          done
      }
      

      如果您只想逐行打印参数,还有一种更简单的方法是使用printf

      save() {
          printf '%s\n' "${@:2}"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 2021-12-18
        • 2021-06-20
        • 2014-04-04
        • 2015-06-16
        相关资源
        最近更新 更多