SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

Linuxの [: 引数が多すぎます

ブログ開始当初に書いた記事でしたが、特定の検索ワードでそれなりの順位に出るのに記述内容があまりにひどかったので書き直しました。

Linuxの [: 引数が多すぎます」についてはいくつかの出現パターンがありますが、シェルスクリプトで簡単に再現できたものだけやります。

超簡単に言うと、シェルスクリプトの判定式if [ command ]で発生している場合には[[]]で囲うようにしてあげます。

 

■例1

変数などにスペースが格納されているときに起きる?
変数の展開時に別の引数として扱われるっぽいですね。

#!/bin/bash

chktest="test siken"
if [ $chktest == $1 ];
        then
                echo "これはテストです。"
fi

echo "終了"

・実行例

[wantan@server1 work]$ ./test.sh "test siken"
./test.sh: 4 行: [: 引数が多すぎます
終了

・例1-修正例

基本的には二重カッコで囲うだけ。

#!/bin/bash

chktest="test siken"
if [[ $chktest == $1 ]];
        then
                echo "これはテストです。"
fi

echo "終了"


■例2

ANDやORの条件で発生した場合。

#!/bin/bash

chktest="test"
if [ $chktest == $1 -o -f testfile ];
        then
                echo "これはテストです。"
fi

echo "終了"

・実行

[wantan@server1 work]$ ./test.sh
./test.sh: 4 行: [: 引数が多すぎます
終了

・例2-修正例

これも二重カッコで囲う。

注意点としては二重カッコで囲った場合には-a-oは使えません。そのままやろうとする
と別のエラーになります。
それぞれ以下を使用します。

AND条件→→&&
OR 条件→→||

#!/bin/bash

chktest="test"
if [[ $chktest == $1 || -f testfile ]];
        then
                echo "これはテストです。"
fi

echo "終了"

ジバンでbash等を指定している場合には基本的には二重カッコを使用した方が無難っぽいですね。
後は判定値が空で以下のようなメッセージが表示された場合にはも同様に二重カッコで囲うことで解消できる場合がありそうです。

./test.sh: 4 行: [: test: 単項演算子が予期されます

そこまで深くは分かってないです。
解決しない場合やもっとちゃんと知りたい場合には「ワード分割」、「パス展開」などでも検索してみてください。

流石に元がひど過ぎる記事だったので、自分で検索して偶然ヒットして見てみたら驚いた。