シェルスクリプト関数でawk $変数をどのようにエスケープする必要がありますか?

シェルスクリプト関数でawk $変数をどのようにエスケープする必要がありますか?

シェルスクリプト関数でawkを使用しようとしていますが、awk変数($ 4)を正しくエスケープする方法を示す参照が見つからないようです。関数内では、関数に渡された4番目の項目(空)で連続的に置き換えられます。


iHealthGetFile()
{
    fileID=$(cat qkViews/${dir}iHealth-Files.json|grep -B5 '${1}'|grep id|awk '{print $4}'|sed 's/,//g; s/\"//g')
    echo $fileID
    echo "Retrieving file $1 as $fileID from ID: $ID"
}

(免責事項:はい、おそらくパイプコマンドを使用して他のことを行うことができます...しかし、私の主な目標はまず$ 4脱出を見つけることです。)

答え1

私が知る限り、コンテキストデータはなく、エラーはコードにはありませんが、リテラルの4文字を見つけるawk最初のコードにあります。私はこれが関数に渡された最初の引数だと思います。grep${1}

あなたのコードをいくつか修正しました。不要なスペースを本当に削除するには、echo $fileID変数の周りに追加した二重引用符を削除する必要があります。

また、複数のグローバル変数を使用しました。ローカル変数($1)とグローバル変数($dirおよび$ID)を混在させることは特に良いコーディング習慣ではありませんが、スクリプトには実用主義が必要な場合があります。

iHealthGetFile()
{
    fileID=$(
        grep -B5 "$1" "qkViews/${dir}iHealth-Files.json" |
        awk '/id/ {print $4}'|
        tr -d ',"'
    )
    echo "$fileID"
    echo "Retrieving file $1 as $fileID from ID: $ID"
}

答え2

あなたの質問では、シェル関数に渡された$ 4がnullであるため、awkはnullを返すと主張します。

awk(またはパイプライン全体)がnullを返す理由は、シェル関数引数との混同によるものではありません。
これは、awk(awkパイプラインの左側の部分)にデータを供給するすべての項目に有効な4番目のフィールドがないためです。

このテストはこれを証明します:

$ function tt { echo "1:$1-2:$2-3:$3-4:$4"; echo "first second third fourth" |awk '{print $4}'; }
$ tt one two #call the function with only two parameters. 3 and 4 are null
1:one-2:two-3:-4: #Parameters passed to function
fourth #awk result

ご覧のとおり、awkの結果は関数パラメータの影響を受けません。 awkに提供されたデータが有効な場合、データの4番目のフィールドが返されます。

関連情報