2017年12月15日金曜日

bashスクリプトの if 文で ==

自作 bash スクリプトの if 文で、== で書いてしまっていた箇所があり、間違いではないか(正しく動作していないのでは?)という疑念を持ち調べたところ、bash の [ ] の中では、== も受け付けてくれると知りました。でもまあ、疑惑のタネになると思うので、旧来のBシェルの記述に従って == の箇所は = に直しました。
man bash より抜粋。
...
       string1 == string2
       string1 = string2
              True if the strings are equal.  = should be used with the test command for POSIX conformance.
...
bash 組み込みの help だと、man のような記述はありませんでした。
[root@hoge ~]# help test
test: test [expr]
    Evaluate conditional expression.
...

      -n STRING
         STRING      True if string is not empty.
    
      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
...
なお、test コマンド(bash 組み込みではないほう)の man だと記述はありませんが、== も受け付けるようです。
...
       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
...
[root@hoge ~]# /usr/bin/test "a" == "b" ; echo $?
1
[root@hoge ~]# /usr/bin/test "a" == "a" ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "a" ] ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "b" ] ; echo $?
1
[root@hoge ~]# ls -li /usr/bin/test /usr/bin/[
2296639 -rwxr-xr-x. 1 root root 41496 Nov  6  2016 /usr/bin/[
2296722 -rwxr-xr-x. 1 root root 37328 Nov  6  2016 /usr/bin/test
[root@hoge ~]# rpm -qlv coreutils | egrep "/usr/bin/(\[|test)"
-rwxr-xr-x    1 root    root                    41496 Nov  6  2016 /usr/bin/[
-rwxr-xr-x    1 root    root                    37328 Nov  6  2016 /usr/bin/test
ちなみに、/usr/bin/test と /usr/bin/[ の実体は同じかと思ってたのですが、ls -li の結果は食い違ってました。いったい何なんだろう。環境は CentOS7 。

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ