ブログ開始当初に書いた記事でしたが、特定の検索ワードでそれなりの順位に出るのに記述内容があまりにひどかったので書き直しました。
「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: 単項演算子が予期されます
そこまで深くは分かってないです。
解決しない場合やもっとちゃんと知りたい場合には「ワード分割」、「パス展開」などでも検索してみてください。
流石に元がひど過ぎる記事だったので、自分で検索して偶然ヒットして見てみたら驚いた。