【问题标题】:For loop for shell Variables用于 shell 变量的 for 循环
【发布时间】:2016-02-12 23:13:17
【问题描述】:

概述:

我正在尝试为需要多个参数的函数编写错误代码。

  • 示例:

    myfunction arg1 arg2 arg3 arg4

如果这些参数中的任何一个为空,我想给用户一个语法错误。

尝试:

没有写出我试过的个别论点:

# Error Checking
for i in "{1.4}"
do
    # Check for null values of Bash variables:
    [[ -z $"$i" ]] && {
        printf "Syntax Error: Missing Operator see:\nmyfunction --help\n"
        exit
        }
done

-和-

# Error Checking
for i in ${1..4}
do
    # Check for null values of Bash variables:
    [[ -z $i ]] && {
        printf "Syntax Error: Missing Operator see:\nmyfunction --help\n"
        exit
        }
done

尝试的语法检查:

问题:

我试图用 for 循环做的事情可能吗?

任何帮助将不胜感激。

提前致谢!

编辑:

在我开始搞乱引号和美元符号之前,还尝试了以下方法:

# Error Checking
for i in {1..4}
do
    [[ -z $"$i" ]] && {
        printf "Syntax Error: Missing Operator see:\nansi-color --help\n"
        exit
        }
done

【问题讨论】:

标签: bash unix scripting environment-variables


【解决方案1】:

有几种方法可以解决这个问题:

die () { echo "$@" >&2; exit 1; }

myfn () {
        [[ $# == 4 ]] || die 'wrong number of args'

        for d in "$@"; do [[ $d ]] || die 'null arg'; done
}

myfn2 () {
        [[ $# == 4 ]] || die 'wrong number of args'

        for ((i = 1; i <= $#; i++)); do
                [[ ${!i} ]] || die 'null arg'
        done
}

"$@" 可能更惯用。 ! 的间接寻址虽然不常见,但非常方便。

【讨论】:

    【解决方案2】:

    Caleb Adams 指出我可以尝试这样的事情:

    # Error Checking
    [[ $# != 4 ]] && {
        printf "Syntax Error: Missing Operator see:\n\tansi-color --help\n"
        exit
        }
    

    【讨论】:

      【解决方案3】:

      就个人而言,我会使用一个 bash 数组,然后检查它的长度:

        args=($*)
        echo ${#args[*]}
      

      但你可以这样做:

      myfunc() { for i in {1..4}; do if [[ -z ${!i} ]]; then echo error at $i return -1 fi done ...do other stuff }

      【讨论】:

      • 如果某些参数包含空格,则数组将不起作用。考虑myfunction "a b" c "" d。第三个参数为 null,但您的数组有 4 个元素。
      • 点了。更令人尴尬的是,Caleb Adams 建议使用 $# 运算符避免了对数组的需要。空格问题由 for 循环处理,但不是空参数。为此,我见过的最好的建议是使用“替代值的参数扩展”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2018-01-07
      • 2021-06-21
      相关资源
      最近更新 更多