バックティックを使用して変数値にフィルタを適用する

バックティックを使用して変数値にフィルタを適用する

このように簡単な質問をして申し訳ありません。しかし、インターネットでこの問題について読んだ結果、何も役に立たないことがわかりました。私は墓/バックティック演算子をよりよく理解しようとしており、これまで一度を除いてはかなり良いことをしてきました。

bashスクリプトとその中に次の変数があるとしましょう。

var=`ls -al | grep '^...x'

スクリプトはユーザーにいくつかの入力を要求し、その内容に基づいて結果を出力します。だから、私は全体のシナリオのために退屈しないように1つの質問にまとめたいと思います。ユーザーが引数として「-t」を入力すると、スクリプトはユーザーが実行できるすべての.txtファイルを印刷する必要があります。例:

$var | grep '\.txt$'

varの値を再割り当てしようとすると問題が発生します。私はこれを試みます:

var=`$var | grep '\.txt$'`

しかし、これはうまくいきません。ここで何を見逃しているのかよくわかりません。この問題を処理する正しい方法は何ですか?

答え1

コマンドを実行するには、バックティック演算子を使用しないでください。以下を使用するのと同じくらい移植性が低くなります。

$ my_var=$(ls -la | grep '^...x')

問題について試してください。

$ var=$(echo $var | grep '\.txt$')

答え2

バックティック内の内容(コマンドの置き換えbtw) は実行するコマンドです。書くとき

$var | grep '\.txt$'

これにより、値がvarコマンドとして実行されます。これは望むものではありません。grep値をコマンドに入力として渡そうとします。基本的にはそれです。

echo "$var" | grep '\.txt$'

だから課題は

var=`echo "$var" | grep '\.txt$'`

引用規則、特に入れ子になった置換を理解しやすいので、バックティックの代わりにドル括弧構文を使用することをお勧めします。$(拡張で始まるコマンドは一致するものに置き換えられます)

var="$(echo "$var" | grep '\.txt$')"

周囲の二重引用符に注意してください$var。この構文は二重引用符内の$var""値のみを表すため、varより複雑です。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?より多くの情報を知りたいです。

注意してください解析された出力はls通常悪い考えです。。一部のファイル名が破損する可能性があり、最も簡単な方法ではありません。ファイルのみをリストするには、.txtワイルドカードパターンを使用できます*.txt(とは異なり、ドットファイルは含まれません。ドットls -alファイルを含めるにはパターンを追加します.*.txt)。実行可能ファイルのみを検討する場合、信頼できるアプローチは実行可能ファイルをループで処理することです。

for x in *.txt; do
  if [ -x "$x" ]; then
    … do stuff
  fi
done

関連情報