一元运营商的预期

Jor*_*s10 189 bash shell

我一直试图弄清楚这有什么不对,但是无法弄清楚..

这部分似乎是一个错误..

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

calc_1.2: line 75: [: =: unary operator expected
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 419

如果你知道你总是要使用bash,那么总是使用双括号条件复合命令[[ ... ]],而不是Posix兼容的单括号版本要容易得多[ ... ].在[[ ... ]]复合内部,单词拆分和路径名扩展不会应用于单词,因此您可以依赖

if [[ $aug1 == "and" ]];
Run Code Online (Sandbox Code Playgroud)

比较$aug1字符串的值and.

如果你使用[ ... ],你总是需要记住双引号变量,如下所示:

if [ "$aug1" = "and" ];
Run Code Online (Sandbox Code Playgroud)

如果你没有引用变量扩展并且变量未定义或为空,它就会从犯罪现场消失,只留下

if [ = "and" ]; 
Run Code Online (Sandbox Code Playgroud)

这不是一个有效的语法.(如果$aug1包含空格或shell元字符,它也会失败并显示不同的错误消息.)

现代[[运算符具有许多其他不错的功能,包括正则表达式匹配.

  • "现代"?没有[[*总是*在bash?它已经在Korn shell中存在了二十多年,并且在bash之前.(我知道你的意思) (8认同)
  • @spen.smith:根据 [Bash FAQ](https://mywiki.wooledge.org/BashFAQ/061),`[[` 在 v2.02 (1998) 中被添加到 Bash,基于 `ksh`该功能自 20 世纪 80 年代起就可用。2012 年,当 cdarke 写下这条评论时,可以合理地说它“在 Korn shell 中存在了 20 多年”。我在 2012 年使用“现代”这个词肯定是有问题的;今天,这将是荒谬的。但是,仍然有程序员坚持认为 21 年前发布的 C 标准太现代了,无法使用:-) (2认同)
  • 啊,这超级有趣。哈哈!感谢您的指正。 (2认同)
  • @timo:是的,它会起作用。许多人更喜欢引用 `"$aug1"`,尽管这不是必需的。 (2认同)

Juh*_*nia 24

我花了一段时间才发现这一点,但请注意,如果你有间距错误,你也会得到同样的错误:

[: =: unary operator expected
Run Code Online (Sandbox Code Playgroud)

正确:

if [ "$APP_ENV" = "staging" ]
Run Code Online (Sandbox Code Playgroud)

VS

if ["$APP_ENV" = "staging" ]
Run Code Online (Sandbox Code Playgroud)

一如既往地设置-x调试变量有助于找到这些:

set -x
Run Code Online (Sandbox Code Playgroud)

  • 有人在构建脚本中将此错误遗赠给了我。节省了我一些时间,谢谢! (3认同)

yil*_*lee 7

尝试$aug1if[]语句中使用之前赋值; 之后错误消息将消失.