
私は bash スクリプトに取り組んでいて、問題に遭遇しました。通常の if/fi ステートメントの使用から得た知識を活用し、RH 7、Debian 7、Ubuntu などの OS バージョンの選択に関連する変数を設定しようとしています。問題は、思ったように動作しないことです。各部分を手動で実行すると問題なく動作しますが、すべてをスクリプトにすると何も起こりません。
もっと良い方法はありますか?よろしくお願いします
value1=$(cat /etc/redhat-release | awk '{ print $4 }' | cut -c 1)
value2=$(cat /etc/redhat-release | awk '{ print $3 }' | cut -c 1)
value3=$(lsb_release -sr)
value4=$(cat /etc/debian_version)
if [[ $value1 -eq 7 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH7
elif [[ $value2 -eq 6 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH6
elif [[ $value3 = 14.04 ]]; then
OS=Ubuntu
VER=UB1404
elif [[ -e /etc/debian_version ]] && [[ $value4 -eq 7 ]]; then
OS=Debian
VER=DEB7
fi
答え1
問題は、浮動小数点数と文字列の比較に関する問題であると思われます。私の
知る限り、テストは浮動小数点値を処理できないため、 のテストでは$value3 = 14.04
が返されますsyntax error: invalid arithmetic operator (error token is ".04")
。
次のように、数字を文字列として扱うこともできます。
elif [[ "$value3" == "14.04" ]]; then
を囲む引用符にも注意してください。$value3
これは、私のケースでは debian 7.8 で返された を文字列として扱うためにも必要です7.8
。
メインのバージョン番号のみを比較したい場合は、ポイントの後の部分を削除することもできます。これにより、 によって返された文字列が、 パラメーターを使用して区切り文字として定義した で
value3=$(lsb_release -sr | cut -d. -f1)
分割され、結果の最初の列が で選択されます。 これは value4 でも機能します。これにより、 を追加する前と追加した後のmy の出力が切り取られます。lsb_release -sr
.
-d.
-f1
value4=$(cat /etc/debian_version | cut -d. -f1)
/etc/debian_version
7.8
7
cut
存在しないファイルに対する警告を抑制したい場合もあります。RedHat システムが利用できないため、最初の 2 つのコマンドからのエラー メッセージを/dev/null
次のようにリダイレクトしました。
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )
他にサポートが必要な場合はお知らせください。また、スクリプトの出力や予想される出力も追加していただければ、問題がどこにあるかがわかります。