動作していないこのシェルスクリプトがあります。
入力:
Server_Name=1
if [ $Server_Name=1 ]; then
echo Server Name is 1
else
echo Server Name is not 1
fi
出力:
Server Name is 1
しかし、私が変更した場合Server_Name=2
、出力は次のとおりです。
Server Name is 1
Server_Name
から2
、言いたいこと:Server Name is 2
。
if [ $Server_Name=1 ];
部分。
どうすれば修正できますか?
スクリプトは、文字列比較を使用していることを示しています。
サーバー名が数字だけではなく文字列であると仮定します。
文字列比較の場合:if [[ "$Server_Name" == 1 ]]; then
注:
=の間隔はである必要がありますif [ $Server_Name=1 ]; then
間違っている
[[...]] [[と]]の間でパス名の展開やWordの分割が行われないため、エラーが減少します。
「単語」である文字列を引用するのが望ましい
整数比較の場合:if [[ "$Server_Name" -eq 1 ]]; then
詳しくは:
これを試して:
if [ $Server_Name -eq 1 ];then
試して、
#!/bin/bash
Server_Name=50
if [ $Server_Name = 49 ]
then
echo "Server Name is 50"
else
echo "Server Name is below 50"
fi
出力:
#./scriptname.sh
Server Name is below 50
[ $Server_Name=1 ]
単一の括弧内の構文はBashにとって特別ではないため、意図したとおりに機能しません。いつものように、変数$Server_Name
は1に置き換えられるため、すべてのtest([
)コマンドは単一の引数であると見なします:文字列1=1
。その文字列の長さがゼロでないため、testはtrueを返します。
POSIX準拠のシェルでは、次のtestコマンドを使用できます。
[ "$Server_Name" = 1 ]
チェックは、$Server_Name
が文字列1
と等しいことです。
[ "$Server_Name" -eq 1 ]
チェックは、$Server_Name
がnumber1
と等しい、つまり、文字列比較ではなく数値比較を行います。
たとえば、Server_Name=01
を定義すると、2つのコマンドの戻り値は異なります。最初のものはfalseを返し、2番目はtrueを返します。
変数$Server_Name
が未定義である可能性がある場合は、変数mustを引用するか、testが表示されることに注意してください。呼び出されたときのエラー。
簡単な答え。あなたのコードは正しいです-ほとんど。あなたが欠けている唯一のものはスペースです...(そして多分余分な "=")
if [ $Server_Name=1 ]; then
正しく計算されません。
if [ $Server_Name == 1 ]; then
あなたが求めるものです。
そして、文字列と数値についてのステートメントです。 is/is-notのような比較を検索しているときはいつでも、==は常に問題ありません。
そして、私は常にサーバー名を数字ではなく文字列として持っていると思います-そうですか? ;-)
あなたのコーディングの頑丈な見習いで頑張ってください。
チャオ