シェルプログラミング - 引数が無い場合

あらためて…

引数の取得

$ cat ./01.sh
echo 0-$0 
echo 1-$1 
echo 2-$2 
echo 3-$3  
$ ./01.sh
0-./01.sh
1-
2-
3-
$ ./01.sh AAA BBB
0-./01.sh
1-AAA
2-BBB

引数がない場合 多分やり方が間違ってる ← やっぱあり

引数が与えられなかった場合は何になるのか?

$ cat ./03.sh
echo 0-$0 

if [ $1 = "" ]
then
  echo "S1 is NULL?"
elif [ $1 = "AAA" ]
then
  echo "S1 is AAA"
else
  echo "$1="$1
fi

if [ $2 = "" ]
then
  echo "S2 is NULL?"
else
  echo "$2="$2
fi

if [ $3 = "" ]
then
  echo "S3 is NULL?"
else
  echo "$3="$3
fi

エラーになりました。

$ ./03.sh AAA1 BCB
0-./03.sh
AAA1=AAA1
BCB=BCB
./03.sh: line 23: [: =: unary operator expected
=

原因は引数がない場合の比較になります。
これでエラーになる場合はどうしたらいいんだろう?
一回変数に入れ込めばいいのかなぁ

【NG】以下のようにしても同じエラーがでます。
変数の比較方法はあってるんだけど…

PARAM3=$3
if [ ${PARAM3} = "" ]
then
  echo "S3 is NULL?"
else
  echo "$3="$3
fi

以下のようにすればやりたいことが出来ました。
これは正しいのだろうか?

「"」で囲って文字列になるので、その時に""になるってことなのかな。

$ cat ./03.sh
echo 0-$0 

if [ $1 = "" ]
then
  echo "S1 is NULL?"
elif [ $1 = "AAA" ]
then
  echo "S1 is AAA"
else
  echo "$1="$1
fi

if [ $2 = "" ]
then
  echo "S2 is NULL?"
else
  echo "$2="$2
fi


PARAM3=$3
if [ "${PARAM3}" = "" ]
then
  echo "S3 is NULL?"
else
  echo "$3="$3
fi
$ ./03.sh AAA1 BCB
0-./03.sh
AAA1=AAA1
BCB=BCB
S3 is NULL?

引数がない場合 もう一度確認

【確認】変数に文字列がある場合の比較は

VAL1="Hello"
if [ ${VAL1}="Hello" ]
then
  echo VAL1 is '"Hello"'
else
  echo VAL1=${VAL1}
fi

-----OUTPUT-----
VAL1 is "Hello"

【確認】変数を空文字にしてみる

VAL2=""
if [ ${VAL2}="" ]
then
  echo VAL2 is '""'
else
  echo VAL2=${VAL2}
fi
-----OUTPUT -----
VAL2 is ""

【NG】引数が無い場合
よく考えたら「引数無し」を空文字と比べていること自体おかしいきがしてきた

if [ $1 = "" ]
then
  echo PARAM1 is NULL?
else
  echo PARAM1=$1
fi
-----OUTPUT -----
$ ./03.sh
./03.sh: line 1: [: =: unary operator expected
PARAM1=

とりあえず進みます。

【NG】一旦変数に入れても結果は同じ

PARAM1=$1
if [ ${PARAM1} = "" ]
then
  echo PARAM1 is NULL?
else
  echo PARAM1=$1
fi

$ ./03.sh
./03.sh: line 3: [: =: unary operator expected
PARAM1=

【OKだけど】「"」で囲って文字列にしてみる。
これで意図したことが出来ましたが…いいんだろうか?

PARAM1=$1

if [ "${PARAM1}" = "" ]
then
  echo PARAM1 is NULL?
else
  echo PARAM1=$1
fi

-----OUTPUT -----
$ ./03.sh
PARAM1 is NULL?

少し立ち戻ってエラーの原因を調べます。「unary operator expected」で調べてみると結構見つかります。

変数に格納されている文字列比較において、文字列の比較は文字列と行う必要があるところを、文字列と何かわからない型の変数を比較してしまっているので、このようなエラーが発生らしい。

https://fluidx.exblog.jp/8405336/

「"」で囲うということは? こちらも調べます。

以下のページわかりやすいし勉強になります。

ダブルクォートは文字列の中に $ で変数が参照されていれば、変数の内容を文字列内に展開します。

https://webbibouroku.com/Blog/Article/linux-quotation#outline__1_2

このあたりも、ふわっとしたままだったな。

となると、この書き方も正解だな

引数の場合は別の方法があり、これが正解

引数が無い場合のチェックについてしらべると…
いろいろ見つかりました。 

やっぱり、定形がありました。

引数の場合は以下が正解らしいです。
そもそも、引数の数を確認するのが先かもしれませんが…

# パラメータ1が空文字か判定
if [ -z "${1}" ]; then
    echo "blank"
else
    echo "param1 = ${1}"
fi
----OUTPUT -----
blank

この記事が気に入ったらサポートをしてみませんか?