echo$と変数

echo$と変数

以下のように最後のディレクトリを印刷しようとしています。

#!/bin/bash
dirc="/a/b/"
i=3  
`echo "$dirc" | awk -F / '{ print ""$"i"}'`

「b」を印刷する必要がありますが、そのようなことは発生しません。

答え1

iAWK変数は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番目に区切られたフィールドを取得するには、たとえば変数を値に設定し、awkinを使用してi番目のフィールドにアクセスします。awkvar$i$varawk

$ i=3
$ echo "$dirc" | awk -v var="$i" -F '/' '{ print $var }'
b

varinとin$varの違いは、数値(この場合)ですが、数値に対応するフィールドの値であることawkです。var$var


ilkkachuが指摘したように、コードの最後の行のバックティックは意味がありません。コマンドの結果(文字列b)が実行されるコマンドとして解釈されます。

関連情報