Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;应为一元运算符“;Bash if条件中的错误_Bash_Shell - Fatal编程技术网

&引用;应为一元运算符“;Bash if条件中的错误

&引用;应为一元运算符“;Bash if条件中的错误,bash,shell,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 "&

此脚本出现错误:

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

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

if [[ $aug1 == "and" ]];
$aug1
的值与字符串
进行比较

如果使用
[…]
,则始终需要记住将变量双引号,如下所示:

if [ "$aug1" = "and" ];
如果不引用变量展开式,并且变量未定义或为空,它将从犯罪现场消失,只留下

if [ = "and" ]; 
这不是有效的语法。(如果
$aug1
包含空格或shell元字符,它也会失败,并显示不同的错误消息。)


现代的
[[
操作符还有很多其他的好功能,包括正则表达式匹配。

您也可以为变量设置默认值,因此不需要使用两个“[”,这相当于两个进程(“[”实际上是一个程序),而不是一个进程

它使用以下语法:${VARIABLE:-default}

必须以这样一种方式来考虑整个问题,即“默认”值与“有效”值/内容不同


如果由于某种原因无法实现,您可能需要添加一个步骤,如检查是否存在值,如“If[-z$VARIABLE];然后回显“需要填充变量”或“If[!-z$VARIABLE];然后#一切正常,继续脚本的其余部分”.

if[]
语句中使用之前,请尝试将值赋给
$aug1
;错误消息将在之后消失。

我花了一段时间才发现这一点,但请注意,如果出现间距错误,也会出现相同的错误:

[: =: unary operator expected
正确:

if [ "$APP_ENV" = "staging" ]
vs

一如既往地,设置
-x
调试变量有助于找到以下各项:

set -x

我认为你在第75行的
if
声明需要一个
fi
。如果有疑问,引用vars.@koola,'总是'引用vars.“现代”?不是吗[[总是在bash?它在Korn shell已经有二十多年了,而且早于bash。(我知道你的意思)@cdarke Fwiw,见《学习bash shell》第三版第113页,[…]]在2.05之前的bash版本中不可用。“在doc.lagout.org的在线pdf中,它位于第326页!@spen.smith:根据,
[
是在v2.02(1998)中添加到bash的,基于自20世纪80年代以来可用的
ksh
功能。2012年,当cdarke撰写该评论时,可以合理地说它是“在Korn shell已经有20多年了。”我对“现代”这个词的使用“2012年肯定是有问题的;今天,这将是荒谬的。但是,仍然有程序员坚持认为21年前发布的C标准过于现代,无法使用:-)啊,太有趣了。哈哈!谢谢你的更正。@timo:是的,它会起作用。许多人更喜欢引用
“$aug1”
虽然它不是必需的。
[
不是派生两个进程,它是一个shell内置(而且
[
也是一个Bash内置)。
[
不同于
[
,后者将第二个
[
视为一个字符串有人在构建脚本中把这个bug遗留给了我。为我节省了一些时间,谢谢!
if ["$APP_ENV" = "staging" ]
set -x