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

时间:2013-03-19 10:21:40

标签: bash conditional-statements

我创建了这个小的bash脚本来为我下载repos。但是,如果声明没有正确评估它....我尝试了许多不同的变化,但它只是不起作用。

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可以正常工作。

更新:输出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 ]]

2 个答案:

答案 0 :(得分:3)

此:

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'),你会发现'未找到事件'(如果我想要一个海贝壳,我会去海边;我希望他们留下历史性的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

答案 1 :(得分:-1)

要比较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?