1

我创建了这个小 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

就像信息一样:在if 语句之外,两者都可以正常工作echo $osecho $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 ]]
4

2 回答 2

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% 必要的。然后是[[不支持<=or>=运算符的问题(有人知道为什么不吗?)。所以,你必须使用否定逻辑:

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

当心。附上'event not found' (如果我!想要($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
于 2013-03-19T10:23:44.380 回答
-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' ]]

请参阅:如何在 bash/awk 中比较两个十进制数字?

于 2013-03-19T12:32:04.323 回答