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、引数と(おそらく32または64)=からの出力で呼び出されたコマンドを実行しました。getconf LONG_BIT

[[また、一般に、コマンド名(など)を引数とは別にする必要があります。したがって、これを変更する必要があります。

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シェル表記を残しておくといいのですが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で2つの10進数を比較する方法は?

于 2013-03-19T12:32:04.323 に答える