web-dev-qa-db-ja.com

変数がシェルの数値と等しいかどうかをテストする方法

動作していないこのシェルスクリプトがあります。

入力:

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 ];部分。

どうすれば修正できますか?

11
user2649805

スクリプトは、文字列比較を使用していることを示しています。

サーバー名が数字だけではなく文字列であると仮定します。

文字列比較の場合:
if [[ "$Server_Name" == 1 ]]; then

注:

  • ==の周りのスペースはである必要があります
  • =の間隔はである必要があります
    if [ $Server_Name=1 ]; then 間違っている

  • [[...]] [[と]]の間でパス名の展開やWordの分割が行われないため、エラーが減少します。

  • 「単語」である文字列を引用するのが望ましい

整数比較の場合
if [[ "$Server_Name" -eq 1 ]]; then


詳しくは:

19
Ivan Chau

これを試して:

if [ $Server_Name -eq 1 ];then
4
David Dai

試して、

 #!/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
1
Ranjithkumar T
[ $Server_Name=1 ]

単一の括弧内の構文はBashにとって特別ではないため、意図したとおりに機能しません。いつものように、変数$Server_Nameは1に置き換えられるため、すべてのtest[)コマンドは単一の引数であると見なします:文字列1=1。その文字列の長さがゼロでないため、testtrueを返します。

POSIX準拠のシェルでは、次のtestコマンドを使用できます。

[ "$Server_Name" = 1 ]

チェックは、$Server_Nameが文字列1と等しいことです。

[ "$Server_Name" -eq 1 ]

チェックは、$Server_Namenumber1と等しい、つまり、文字列比較ではなく数値比較を行います。

たとえば、Server_Name=01を定義すると、2つのコマンドの戻り値は異なります。最初のものはfalseを返し、2番目はtrueを返します。

変数$Server_Nameが未定義である可能性がある場合は、変数mustを引用するか、testが表示されることに注意してください。呼び出されたときのエラー。

1
Dennis

簡単な答え。あなたのコードは正しいです-ほとんど。あなたが欠けている唯一のものはスペースです...(そして多分余分な "=")

if [ $Server_Name=1 ]; then

正しく計算されません。

if [ $Server_Name == 1 ]; then  

あなたが求めるものです。

そして、文字列と数値についてのステートメントです。 is/is-notのような比較を検索しているときはいつでも、==は常に問題ありません。

そして、私は常にサーバー名を数字ではなく文字列として持っていると思います-そうですか? ;-)

あなたのコーディングの頑丈な見習いで頑張ってください。

チャオ

0
Tobibobi