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 ]]
答
的输出此:
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
答
比较浮在击点数尝试以下操作:
- if [[$os = 'CentOs' && $version >= '6.0' && $arch = '64']]
+ if [[ $os = 'CentOs' ]] && [[ "$(echo "if (${version} >= 6.0 1 else 0" | bc)" -eq 1 ]] && [[ $arch = '64' ]]
+0
具有多个字段(例如6.0.1)的版本号不能被视为浮点数。 – chepner 2013-03-19 12:36:42
不要被改写,以便它仅包含了答案破坏的问题。 – 2013-03-19 10:52:35