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


12

このシェルスクリプトが機能していません。

入力:

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 ];一部であることを知っています。

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


Davidが以下で指摘するように、数値をテストするには「-eq」を使用する必要があります。エラーを回避するために、空の変数をチェックすることもできます。if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock 2013

回答:


21

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

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

以下のための文字列の比較
if [[ "$Server_Name" == 1 ]]; then

ノート:

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

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

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

以下のための整数の比較
if [[ "$Server_Name" -eq 1 ]]; then


詳しくは:


2
[[はbash構文であり、OPはそれが機能しないシェルについて尋ねていました
gilad mayani


2
[ $Server_Name=1 ]

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

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

[ "$Server_Name" = 1 ]

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

[ "$Server_Name" -eq 1 ]

チェックあり$Server_Nameに等しい 1、すなわち、それは代わりに、文字列比較の数値比較を行います。

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

変数$Server_Nameが未定義である可能性がある場合は、引用する必要あります。そうしないと、呼び出されたときにテストでエラーが表示されます。


1

試して、

 #!/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

0

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

if [ $Server_Name=1 ]; then

正しく計算されません。

if [ $Server_Name == 1 ]; then  

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

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

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

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

チャオ


アメージング非常に多くの答えは...ここにある
Tobibobi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.