shell脚本if参数太多_if [](方括号)中的“ [:过多参数”错误的含义

如果您$VARIABLE的字符串是包含空格或其他特殊字符的字符串,并且使用了一个方括号(这是test命令的快捷方式),则该字符串可能会拆分为多个单词。这些每个都被视为一个单独的参数。

因此,一个变量被分成许多参数:

VARIABLE=$(/some/command);

# returns "hello world"

if [ $VARIABLE == 0 ]; then

# fails as if you wrote:

# if [ hello world == 0 ]

fi

对于放下包含空格或其他特殊字符的字符串的任何函数调用,也是如此。

容易修复

将变量输出用双引号引起来,强制其保留为一个字符串(因此为一个参数)。例如,

VARIABLE=$(/some/command);

if [ "$VARIABLE" == 0 ]; then

# some action

fi

就那么简单。但是,如果您也不能保证变量不会是一个空字符串,或者除了空格以外就什么都不是的字符串,请跳到下面的“也请注意...”。

或者,另一种解决方法是使用双方括号(这是该new test命令的快捷方式)。

但是,它仅存在于bash(显然是korn和zsh)中,因此可能与/bin/shetc 调用的默认shell不兼容。

这意味着在某些系统上,它可能可以在控制台上运行,但在其他地方(例如从)调用时则不能cron,具体取决于所有配置方式。

它看起来像这样:

VARIABLE=$(/some/command);

if [[ $VARIABLE == 0 ]]; then

# some action

fi

如果您的命令包含这样的双方括号,并且您在日志中遇到错误,但可以从控制台运行,请尝试将换成[[此处建议的替代方法,或者确保运行脚本的任何东西都使用支持[[aka 的外壳new test。

还要提防[: unary operator expected错误

如果看到“参数太多”错误,则很可能是您从函数中获得了一个字符串,该字符串的输出不可预测。如果还可以获取一个空字符串(或所有空白字符串),那么即使使用上述“快速修复”,也将其视为零参数,并且将失败[: unary operator expected

如果您习惯于其他语言,则这是相同的“陷阱”-您不希望变量的内容在评估之前像这样被有效地打印到代码中。

这是一个防止[: too many arguments和[: unary operator expected错误的示例:如果输出为空,则将其替换为默认值(在此示例中为0),并用双引号引起来:

VARIABLE=$(/some/command);

if [ "${VARIABLE:-0}" == 0 ]; then

# some action

fi

(此处,如果$ VARIABLE为0或为空,则将执行该操作。自然地,如果需要不同的行为,则应将0(默认值)更改为其他默认值)

最后说明:由于[是的快捷方式test,因此上述所有错误均适用test: too many arguments(并且也适用test: unary operator expected)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值