より大きな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行目は上の行です。修正の提案はありますか?
これは、test
ビルトインを_[
_経由で使用しており、左側の式がNULを返す場合に発生します。以下を使用してこれを修正できます。
_if [ x`some | expression | here` = x1 ]; then
_
または、すでにbashを使用しているので、この問題のない、より優れた_(( ))
_構文を使用できます。
_if (( $(some | expression | here) == 1 )); then
_
バックティック上のコマンド置換にも$()
を使用したことに注意してください ``後者は非POSIXであり、非推奨です
追加の構文なしでコマンドを実行できます。たとえば、次はgrepの終了コードをチェックして、正規表現が一致するかどうかを判断します。
if ! grep -q "$Word" /usr/share/dict/words
then
echo "Word $Word is not valid Word!"
fi
エラーが発生するのは、コマンドの置換がテストを次のように効果的に返すものを何も返さないためです。
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 ]
ご了承ください =
は、文字列を比較するために使用されています。
比較の両側に「x」を追加することも、単に左側を引用することもできます。
[ "$(command | pipeline)" = 1 ]
最後のcut
とsed
が何のためなのかわかりません。パイプラインのwc -l
の出力は単なる数字です。
[[test_expression]];を試してください。代わりに[test_expression];