web-dev-qa-db-ja.com

bashスクリプトのifステートメント内のコマンド

より大きなbashスクリプトの一部として、次の行があります。

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^  *//g'` -eq 1 ] 

スクリプトを実行すると、次のようになります。

./install.sh:219行目:[:-eq:単項演算子が必要です

219行目は上の行です。修正の提案はありますか?

21
myahya

これは、testビルトインを_[_経由で使用しており、左側の式がNULを返す場合に発生します。以下を使用してこれを修正できます。

_if [ x`some | expression | here` = x1 ]; then
_

または、すでにbashを使用しているので、この問題のない、より優れた_(( ))_構文を使用できます。

_if (( $(some | expression | here) == 1 )); then
_

バックティック上のコマンド置換にも$()を使用したことに注意してください ``後者は非POSIXであり、非推奨です

30
SiegeX

追加の構文なしでコマンドを実行できます。たとえば、次はgrepの終了コードをチェックして、正規表現が一致するかどうかを判断します。

if ! grep -q "$Word" /usr/share/dict/words
then
    echo "Word $Word is not valid Word!"
fi
26
Alex Spurling

エラーが発生するのは、コマンドの置換がテストを次のように効果的に返すものを何も返さないためです。

if [ -eq 1 ] 

これを修正する一般的な方法は、常にオペランドが空にならないように、方程式の両側に定数を追加することです。

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^  *//g'` = x1 ] 

ご了承ください =は、文字列を比較するために使用されています。

8
codaddict

比較の両側に「x」を追加することも、単に左側を引用することもできます。

[ "$(command | pipeline)" = 1 ]

最後のcutsedが何のためなのかわかりません。パイプラインのwc -lの出力は単なる数字です。

6

[[test_expression]];を試してください。代わりに[test_expression];

5
SOUser