4

欲しいものを手に入れるために無数の方法を試しましたが、何もうまくいかないようです。私はいつものようなものになり2:not foundます。

コマンドの出力をキャプチャして、次のように「!」と等しいかどうかをテストしたい:

function test() {
  local testv=$(command) 2>/dev/null
  if [ $(#testv) == "!" ]; then
    echo "Exclamation mark!"
  else
    echo "No exclamation mark."
  fi
}

エラーを回避するには、上記のコードをどのように書き直す必要がありますtest:2: = not foundか?

4

2 に答える 2

3

これはうまくいくはずです:

if [ $testv = '!' ]; then

ここにはいくつかの問題がありました:

  • $(...)コマンドを実行し、その出力を置き換えます。変数値を代入したいので、$varまたはを使用します${var}
  • 私はそこで何をしていたのか分かりません#${#var}$var の長さを取得しますが、それはここで必要なものではありません。
  • testコマンド (の[同義語) は を理解しない==ので、 (C プログラマーの場合は間違っている=ように見えますが、これは C ではなくシェルです) を使用します。
  • これはスクリプトの問題ではないと思いますが、インタラクティブな入力で"!"は期待どおりに動作しません。以前'!'は、感嘆符が履歴オプションとして解釈されないようにしていました。

[[ ]]別の方法として、の代わりに を使用することもできます。これは[ ]、それが理解できる==(そして、一般的に構文が幾分簡潔になっている) ためです。

if [[ $testv == '!' ]]; then

ところで、このスクリプトが zsh で実行されていることをタグから信頼しています。そうでない場合、構文は少し異なります (基本的なシェルには がなく[[ ]]、zsh 以外のものは、二重引用符で囲まれていない限り、$testv の値に対して不要な解析を行います)。よくわからない場合 (または移植可能にしたい場合) は、posix 準拠のシェルで動作するバージョンを次に示します。

if [ "$testv" = '!' ]; then
于 2012-02-19T09:48:04.717 に答える
2

これで試してください:

local testv=$(command 2>/dev/null)

リダイレクトしたいコマンドの出力だからです。

(私はあなたが何を意味するのか分かりません$(#testv)。)

于 2012-02-19T08:54:17.747 に答える