我应该如何在 shell 脚本函数中转义 awk $ 变量?

我应该如何在 shell 脚本函数中转义 awk $ 变量?

我试图在 shell 脚本函数中使用 awk,但似乎找不到告诉我如何正确转义 awk 变量($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

据我所知,没有任何上下文数据,错误不在您的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

在您的问题中,您声称 awk 返回 null,因为传递给 shell 函数的 $4 为 null。

awk(或整个管道)返回 null 的原因并不是由于与 shell 函数参数的某种混淆。
这只是因为向 awk 提供数据的任何内容(awk 管道的左侧部分)都没有有效的第四个字段。

这个测试将证明这一点:

$ 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 个字段。

相关内容