【问题标题】:Multiple conditions in an if statement in bash not workingbash中if语句中的多个条件不起作用
【发布时间】:2013-03-19 10:21:39
【问题描述】:

我创建了这个小 bash 脚本来为我下载存储库。但是,如果语句没有正确评估它....我尝试了许多不同的变体,但它不起作用。

os=$(lsb_release -si)
version=$(lsb_release -sr)
arch = `getconf LONG_BIT`
if [[$os = 'CentOs' && $version >= '6.0' && $arch = '64']]
then
    echo "Works fine"
    echo $version 
    echo $os 
fi

就像信息一样:echo $osecho $version 在 if 语句之外都可以正常工作。

更新:bash -x test.sh 的输出

++ lsb_release -si
+ os=CentOS
++ lsb_release -sr
+ version=6.4
++ getconf LONG_BIT
+ arch=64
+ [[ CentOS = \C\e\n\t\O\s ]]

【问题讨论】:

  • 不要重写问题,让它只包含答案。

标签: bash conditional-statements


【解决方案1】:

这个:

arch = `getconf LONG_BIT`

应该是:

arch=`getconf LONG_BIT`

或更好:

arch=$(getconf LONG_BIT)

您不能在 bash 中的分配周围使用空格。你写的内容执行了一个名为 arch 的命令,参数为 =,输出来自 getconf LONG_BIT(大概是 32 或 64)。

通常,您还需要将命令名称(例如[[)与参数分开。所以,你需要改变这个:

if [[$os = 'CentOs' && $version >= '6.0' && $arch = '64']]

所以它在“命令”名称周围有空格(在[[ 之后和]] 之前):

if [[ $os = 'CentOs' && $version >= '6.0' && $arch = '64' ]]

我可能会将变量括在双引号中,但这不是 100% 必要的。然后是[[ 不支持<=>= 运算符的问题(有人知道为什么不支持吗?)。所以,你必须使用否定逻辑:

if [[ $os = 'CentOs' && ! ($version < '6.0') && $arch = '64' ]]

小心。将! 附加到($version &lt; '6.0'),你会得到“未找到事件”(如果我想要一个贝壳,我会去海边;我希望他们将历史 C shell 符号从 bash 中删除)。

os=$(lsb_release -si)
version=$(lsb_release -sr)
arch=$(getconf LONG_BIT)
if [[ $os = 'CentOs' && ! ($version < '6.0') && $arch = '64' ]]
then
    echo "Works fine"
    echo "Version $version; OS $os; Arch $arch"
fi

【讨论】:

  • test.sh: 第 5 行:'6.0'' test.sh: line 5: if [[ $os = 'CentOs' && $version >= '6.0' && $arch = '64' ]]' 附近的语法错误跨度>
  • 我对缺少字符串 '=' 的猜测:除了版本号之外,您很少(如果有的话)需要这些条件。
  • 我复制了你在上面给我的 sn-p 并删除了版本以便我工作,但我仍然没有输出(没有错误消息)
  • 我建议您将您正在运行的版本中的代码添加到问题中,并显示bash -x yourscript.sh的输出。给定:os=CentOs; version=6.0; arch=64; if [[ $os = 'Centos' &amp;&amp; ! ($version &lt; '6.0') &amp;&amp; $arch = '64' ]]; then echo Hi; fi,我得到了“嗨”的回应。你呢?
  • 我在主帖中添加了bash -x yourscript.sh 的输出
【解决方案2】:

要在 Bash 中比较浮点数,请尝试以下操作:

- if [[$os = 'CentOs' && $version >= '6.0' && $arch = '64']]
+ if [[ $os = 'CentOs' ]] && [[ "$(echo "if (${version} >= 6.0 1 else 0" | bc)" -eq 1 ]] && [[ $arch = '64' ]]

见:How to compare two decimal numbers in bash/awk?

【讨论】:

  • 具有多个字段的版本号(例如 6.0.1)不能被视为浮点数。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2021-11-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多