bash中的if语句中的多个条件不起作用

问题描述:

我创建了这个小bash脚本来为我下载回购。但是,如果声明不正确评估它....我尝试了许多不同的变化,但它不工作。bash中的if语句中的多个条件不起作用

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 $os & echo $version做工精细OUTSIDE 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 ]] 
+0

不要被改写,以便它仅包含了答案破坏的问题。 – 2013-03-19 10:52:35

的输出此:

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 < '6.0'),你会得到“未找到的事件”(如果我想要一个海贝壳,我会去海边;我希望他们会留下bash以外的历史C壳符号)。

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 
+0

test.sh:line 5:'6.0'附近的语法错误' test.sh:line 5:'if [[$ os ='CentOs'&& $ version> ='6.0'&& $ arch ='64']] ]' – Werulz 2013-03-19 10:36:26

+0

我对缺少字符串' ='的猜测:除了版本号以外,如果有的话,您很少需要这些条件。 – chepner 2013-03-19 12:02:17

+0

我复制了上面给出的代码片段,我删除了版本以便我可以工作,但是我仍然得不到输出(没有错误消息) – Werulz 2013-03-19 13:09:37

比较浮在击点数尝试以下操作:

- 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?

+0

具有多个字段(例如6.0.1)的版本号不能被视为浮点数。 – chepner 2013-03-19 12:36:42