我试图在 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 个字段。