0

私は自分のデバイス用のスクリプトを書くつもりでした。これが私の最初のコードです:

dev_name=random_sting
major=`awk "\$2 ~ /^${dev_name}\$/ { print \$1 }" /proc/devices`

するとエラーが発生

awk:  ~ /^random_string$/ { print  }
awk:  ^ syntax error

その間、私は実験をしました:

var1=random_string
echo "\$ /^$var1\$/ \$"

出力は

$ /^random_string$/ $

構文は正しいはずですが、誰か答えてもらえますか?

4

4 に答える 4

2

バックティック内に追加のエスケープが必要です。代わりに使用してみてくださいmajor=$( .. )..

于 2013-02-24T07:22:44.853 に答える
2

この場合、次のように の-vオプションを使用して、エスケープの必要性を回避することもできます。awk

major=`awk -v dev="$dev_name" '$2 ~ dev { print $1 }' /proc/devices`
于 2013-02-24T07:24:00.107 に答える
1

バックティック内の式は、2 つの shell/unescape ステージを通過します。

awk "\$2 ~ /^${dev_name}\$/ { print \$1 }" /proc/devices

...あなたのbashによって展開され、エスケープされません...

awk "$2 ~ /^random_string$/ { print $1 }" /proc/devices`

...バッククォートによって開始されたシェルが展開され、再びアンエスケープされます...

awk "~ /^random_string$/ { print  }" /proc/devices`

... $1 と $2 が定義されていないためです。

あなたがしたいことは、$1 と $2 を 2 回エスケープすることです。

awk "\\\$2 ~ /^${dev_name}\$/ { print \\\$1 }" /proc/devices

...実行された最終結果を作成するには...

awk "$2 ~ /^random_string\$/ { print $1 }" /proc/devices
于 2013-02-24T07:40:07.890 に答える