Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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_If Statement - Fatal编程技术网

bash脚本中的多个'if'语句

bash脚本中的多个'if'语句,bash,if-statement,Bash,If Statement,我正在尝试编写一个简短的bash脚本,它可以选择从命令行接受参数,或者提示输入参数 if [ [ -z "$message" ] && [ -z "$predefined" ] ] ; then read -p "Enter message [$defaultMessage]: " message message=${message:-$defaultMessage} else if [ -n "$predefined" ]; then if [ -f $ba

我正在尝试编写一个简短的bash脚本,它可以选择从命令行接受参数,或者提示输入参数

if [ [ -z "$message" ] && [ -z "$predefined" ] ] ; then
  read -p "Enter message [$defaultMessage]: " message
  message=${message:-$defaultMessage}
else
  if [ -n "$predefined" ]; then
    if [ -f $base/$environment/vle/data/$predefined.txt ]; then
      echo Predefined message file $predefined.txt does not exist
      exit 1
    fi
  fi
fi
如果消息和预定义都没有作为命令行参数传入,那么代码应该提示输入消息的值;否则,如果预定义已作为命令行参数传入,则脚本应测试该名称的文件是否存在,并且仅当该文件确实存在时才继续

但是我得到了以下错误

[: -z: binary operator expected
在第一次if测试中

在解释我的第一个if语句的语法有什么问题时有什么帮助吗?或者提供替代语法以实现相同的目标。

第一个if格式不正确。这将有助于:

if [ -z "$message" ] && [ -z "$predefined" ]; then
或者这个:

if test -z "$message" && test -z "$predefined"; then
或者这种特定于bash、简单但肮脏的方式:

if [[ -z "$message" ]] && [[ -z "$predefined" ]]; then
或者以这种特定于bash的正确方式:

if [[ -z $message && -z $predefined ]]; then
在最后一个版本中,双引号是不必要的,而不是打字错误

感谢对bash特定样式的更正,以及最后的评论:

我应该注意到,有一种情况下,双引号在[…]中仍然是必须的,即如果您希望字符串比较==右侧的变量引用被视为文字:

v='[a]'
[[ $v == $v ]] # FALSE!
[[ $v == "$v" ]] # true
如果没有双引号,右侧将被解释为模式。有些人主张总是重复引用变量引用,以便不必记住这些微妙之处。也就是说,从Bash3.2开始,当正则表达式与=~

第一个if的格式不好。这将有助于:

if [ -z "$message" ] && [ -z "$predefined" ]; then
或者这个:

if test -z "$message" && test -z "$predefined"; then
或者这种特定于bash、简单但肮脏的方式:

if [[ -z "$message" ]] && [[ -z "$predefined" ]]; then
或者以这种特定于bash的正确方式:

if [[ -z $message && -z $predefined ]]; then
在最后一个版本中,双引号是不必要的,而不是打字错误

感谢对bash特定样式的更正,以及最后的评论:

我应该注意到,有一种情况下,双引号在[…]中仍然是必须的,即如果您希望字符串比较==右侧的变量引用被视为文字:

v='[a]'
[[ $v == $v ]] # FALSE!
[[ $v == "$v" ]] # true
如果没有双引号,右侧将被解释为模式。有些人主张总是重复引用变量引用,以便不必记住这些微妙之处。也就是说,从Bash3.2开始,当正则表达式与=~

如果两个表达式都为真,则为真

test expression1 -o expression2
if [ -z "$message" -a -z "$predefined" ]; then
    read -p "Enter message [$defaultMessage]: " message
    message=${message:-$defaultMessage}
else
    if [ -n "$predefined" -a -f $base/$environment/vle/data/$predefined.txt ]; then
        echo Predefined message file $predefined.txt does not exist
        exit 1
    fi
fi
如果其中一个表达式或两个表达式都为真,则为真

test expression1 -o expression2
if [ -z "$message" -a -z "$predefined" ]; then
    read -p "Enter message [$defaultMessage]: " message
    message=${message:-$defaultMessage}
else
    if [ -n "$predefined" -a -f $base/$environment/vle/data/$predefined.txt ]; then
        echo Predefined message file $predefined.txt does not exist
        exit 1
    fi
fi
这可以将4个测试组合成2个,同时也可以去掉一个嵌套的if表达式;然后fi

如果两个表达式都为真,则为真

test expression1 -o expression2
if [ -z "$message" -a -z "$predefined" ]; then
    read -p "Enter message [$defaultMessage]: " message
    message=${message:-$defaultMessage}
else
    if [ -n "$predefined" -a -f $base/$environment/vle/data/$predefined.txt ]; then
        echo Predefined message file $predefined.txt does not exist
        exit 1
    fi
fi
如果其中一个表达式或两个表达式都为真,则为真

test expression1 -o expression2
if [ -z "$message" -a -z "$predefined" ]; then
    read -p "Enter message [$defaultMessage]: " message
    message=${message:-$defaultMessage}
else
    if [ -n "$predefined" -a -f $base/$environment/vle/data/$predefined.txt ]; then
        echo Predefined message file $predefined.txt does not exist
        exit 1
    fi
fi

这可以将4个测试组合成2个,同时也可以去掉一个嵌套的if表达式;然后fi

通常有助于诊断此类问题,如@thatotherguy中所述-谢谢,每当我编写shell脚本时,我都会记住这个链接。请注意,您可以运行它。通常有助于诊断此类问题,如@thatotherguy中所述-谢谢,每当我编写shell脚本时,我都会记住该链接。请注意,您可以运行该链接。第一个和第三个代码段保留POSIX兼容性,但第二个特定于bash的代码段可以简化为:if[-z$message&-z$prefined];然后;-i、 e.:&&内部[…];另外,使用[…]可以避免重复引用。很好,谢谢@mklement0,我根据您的评论更正了我的答案谢谢更新+1.我应该注意到,有一种情况下,双引号在[…]中仍然是必须的,即如果您希望字符串比较==右侧的变量引用被视为文本:v='[a]';[$v==$v]]错误!;[$v==$v]]对。如果没有双引号,右侧将被解释为模式。有些人主张总是重复引用变量引用,以便不必记住这些微妙之处。也就是说,从Bash3.2开始,当正则表达式与=~@mklement0 hmm匹配时,不能双引号引用正确的操作数。很高兴知道,谢谢,也添加了这个!第一个和第三个代码段保留POSIX兼容性,但第二个特定于bash的代码段可以简化为:if[[-z$message&&&z$prefined]];然后;-i、 e.:&&内部[…];另外,使用[…]可以避免重复引用。很好,谢谢@mklement0,我根据您的评论更正了我的答案谢谢更新+1.我应该注意到,有一种情况下,双引号在[…]中仍然是必须的,即如果您希望字符串比较==右侧的变量引用被视为文本:v='[a]';[$v==$v]]错误!;[$v==$v]]对。如果没有双引号,右侧将被解释为模式。有些人主张总是重复引用变量引用,以便不必记住这些微妙之处。也就是说,从Bash3.2开始,在正则表达式匹配wi时,不能对正确的操作数进行双引号
th=~.@mklement0嗯,很高兴知道,谢谢你,还加了一句!