我创建了这个小的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 ]]
答案 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' ]]