4

bashの第3バージョン(2004年頃)以降に存在するbashの「条件付き正規表現」構造を使用したいと思います。これは次のようになるはずです:

if [[ $string =~ $regexp ]]; then
#do smthg
else
#do somthg else
fi

したがって、この構造に従った私のコードは次のとおりです。その役割は、SSIDに含まれる名前がiwdevwlan0リンクからの出力に含まれているかどうかを確認することです。

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then 
    #do sthming 
else
    echo "wrong network"

fi

解読できない何らかの理由で、このステートメントをbashシェルに直接実行すると、このステートメントは非常にうまく機能します。

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then echo found; else echo not found; fi

しかし、含まれているスクリプト内で実行すると、吐き出されます。

scripts/ssidchecker.sh: 22: [[: not found

22は「fi」キーワードの行です。最も奇妙なことは、「else」ステートメントに含まれるコードを常に実行することです。

「見つからない」とは、正規表現がその文字列に何も見つからなかったことを示すことを意味しますか?それは本当のエラーメッセージですか?

4

1 に答える 1

4

開始注:特に最後のコメントへの応答で、問題のコメントからの入力で作成された回答。

まず、何[[ですか?シェルキーワードです。

samveen@maverick:~$ type [[
[[ is a shell keyword

これは、これ[[がコマンドではなくbashの内部キーワードであるため、他のシェルでは機能しないことを意味します。したがって、エラー出力

scripts/ssidchecker.sh: 22: [[: not found

使用しているシェルがおそらく

  • bashではありません
  • 2.02より古いバージョンのbash([[Bash-2.02で導入)

2.02が本当に古いバージョン(Y2K以前)であることを考えると、これはすべて、スクリプトの実行に使用しているシェルがおそらくそう/bin/bashではなく、/bin/shBourneシェルスクリプトに使用される最も一般的なパスであるという事実を示しています。 shebang#!)行。

これをに変更する/bin/bashか、明示的に実行bash scripts/ssidchecker.shしてください。

elseセクションが常に実行された理由については、[[コマンドが見つからないことは、の観点からは失敗(ゼロ以外の戻り値)と同じですif。したがって、elseセクションが実行されます。

samveen@maverick:~$ /bin/whosyourdaddy
-bash: /bin/whosyourdaddy: No such file or directory
samveen@maverick:~$ echo $?
127

移植性に関する補足として、bashhackerswikiは[[キーワードについて次のようにも述べています。

を持っている主要な「POSIXシェルスーパーセット言語」(より良い用語がないため)の中[[で、テスト式複合コマンドは、最も移植性の高い非POSIX機能の1つです。=〜演算子を除いて、ほとんどすべての主要な機能は、Ksh88、Ksh93、mksh、Zsh、およびBashの間で一貫しています。Ksh93は、他のシェルではサポートされていない多数の固有のパターンマッチング機能も追加します。これには、Bashとは異なる構文を使用して呼び出される、いくつかの異なる正規表現ダイアレクトのサポートが含まれますが=~=~kshでは引き続きサポートされ、デフォルトはEREです。

=~したがって、シェルがをサポートしていなくても、シェルがをサポートしている場合は[[、スクリプトが失敗する可能性がありbashます[[

于 2012-05-09T05:58:21.653 に答える