以下のように最後のディレクトリを印刷しようとしています。
#!/bin/bash
dirc="/a/b/"
i=3
`echo "$dirc" | awk -F / '{ print ""$"i"}'`
「b」を印刷する必要がありますが、そのようなことは発生しません。
答え1
i
AWK変数はAWKスクリプトのAWK変数であり、AWK変数を設定する必要があります。
#!/bin/bash
dirc="/a/b/"
echo "${dirc}" | awk -F / -v i=3 '{print $i}'
i
シェルが理解する方法で値を指定できます。
i=3
echo "${dirc}" | awk -F / -v "i=${i}" '{print $i}'
あなたできるAWKスクリプトでシェルに変数を評価させることも可能ですが、これは問題を引き起こすだけです。
i=3
echo "${dirc}" | awk -F / "{print \$${i}}"
答え2
シェルが利用可能文字列演算外部ユーティリティを呼び出さずにディレクトリの最後の部分を取得します。
dirc="/a/b/"
dirc=${dirc%/} # remove trailing / if it is there
echo "${dirc##*/}" # remove everything up to the last /
出力があると機能しないため、b
より良いことがあります。dirc
/
basename
または数値としてフィールドを取得するシェル配列。
IFS=/ read -a dira <<< "$dirc" # split to an array
echo "${dira[2]}" # echo one field, first is 0
さて、echo | awk
間違いなく命令のバックティックはタイプミスですか?これを使用して、シェルは awk の出力を実行するコマンドとして処理します。
答え3
パスの最後の部分を印刷するには、次を使用しますbasename
。
$ dirc='/a/b/'
$ basename "$dirc"
b
/
を使用してi番目に区切られたフィールドを取得するには、たとえば変数を値に設定し、awk
inを使用してi番目のフィールドにアクセスします。awk
var
$i
$var
awk
$ i=3
$ echo "$dirc" | awk -v var="$i" -F '/' '{ print $var }'
b
var
inとin$var
の違いは、数値(この場合)ですが、数値に対応するフィールドの値であることawk
です。var
$var
ilkkachuが指摘したように、コードの最後の行のバックティックは意味がありません。コマンドの結果(文字列b
)が実行されるコマンドとして解釈されます。