我只想将一个存储文件名的 shell 变量传递给 awk 命令。当我在网上搜索这个问题时,我看到了很多不同的选项,但没有一个对我有用。我尝试了以下方法:
#!/bin/bash
for i in "$@"
do
case $i in
-p=*|--producedfile=*)
PFILE="${i#*=}"
shift # past argument=value
*)
# unknown option
;;
esac
done
echo "PRODUCEDFILE = ${PFILE}"
awk -v FILE=${PFILE} '{print FILE $0}' #DIDNT WORK
awk '{print FILE $0}' ${PFILE} # DIDNT WORK
awk -v FILE=${PFILE} '{print $0}' FILE #DIDNT WORK
最佳答案
要将 shell 变量传递给 awk
,您正确地使用了 -v
选项。
但是,shift
是不必要的(您正在使用 for
迭代选项),;;
丢失(您必须终止每个case 分支),以及 awk
要处理的文件的名称。已修复,您的脚本如下所示:
#!/bin/bash
for i in "$@"; do
case $i in
-p=*|--producedfile=*)
PFILE="${i#*=}"
;;
*)
# unknown option
;;
esac
done
echo "PRODUCEDFILE = ${PFILE}"
awk -v FILE="${PFILE}" '{print FILE, $0}' "${PFILE}"
但是请注意,awk
已经使当前处理的文件的名称在 FILENAME
变量中可用。所以,你也可以把最后一行写成:
awk '{print FILENAME, $0}' "${PFILE}"
关于linux - 如何将shell变量传递给shell脚本中的awk命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474248/