【问题标题】:bash scripts hyphen operator and square bracketsbash 脚本连字符运算符和方括号
【发布时间】:2014-04-03 15:18:26
【问题描述】:

请有人告诉我以下脚本中的连字符运算符是什么?

[ "${MYDATA_OPT-}" ] && set "$MYDATA_OPT" "$@"

data=${MYDATA_VER-1}

是否有这些运算符的快速文档?

我也在尝试理解下面的脚本

shift $(($OPTIND -1))

while getopts vhx: c; do
    case "$c" in
            v) let data=data+1 ;;
            h) usage ; exit 0 ;;
            x) . $OPTARG ;;
            \?) usage ; exit 2 ;;
            *) usage ; exit 2 ;;
    esac
done

非常感谢。

【问题讨论】:

  • 提示 - 一旦你弄清楚了,在解释它的代码中添加注释!始终考虑将在您之后维护代码的人。如果原作者这样做了,那会节省你的时间,对吧?
  • 同意.. 我正在尝试淘汰此遗留代码并尝试编写新代码。我会确保我添加 cmets 来帮助其他人:)
  • 这是 POSIX shell 的一个相当常规但并不广为人知的特性。实际上在注释中记录它与将“# Adds to the variable”添加到像i++ 这样的行没有什么不同。我完全赞成评论棘手的逻辑补丁,而不是语言语法。

标签: bash shell unix operators getopts


【解决方案1】:

bash 手册页中参数扩展下引用的表单

3.5.3 Shell参数扩展

${parameter:-word}

如果参数未设置或为空,则替换单词的扩展。 否则,参数的值被替换。

生产

${MY_DATA_VER:-1}

如果 MY_DATA_VER 未设置或设置为空字符串,则将扩展为 1。但是,您的示例省略了冒号:

${MY_DATA_VER-1}

这也记录在手册页中,尽管在记录特定运算符之前的一个句子中相当倾斜(来自 4.1 手册页):

省略冒号会导致仅对未设置的参数进行测试。

因此,在您的示例中,如果从未设置过 MY_DATA_VER,则扩展生成 1,或者如果设置了 MY_DATA_VER 具有的任何值(可能是空字符串)。


shift 示例只是删除了第一个 $OPTIND-1 shell 参数。有关OPTIND 的意义以及getopts 工作原理的说明,请参阅bash 手册页或在bash 提示符处尝试help getopts

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2017-12-05
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多