linux - 如何将shell变量传递给shell脚本中的awk命令

标签 linux bash shell awk

我只想将一个存储文件名的 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/

相关文章:

python - Python 中用于管理包的 "requirements.txt"的 Debian 等价物是什么?

regex - Linux 从命令行查找和替换

linux - 如何通过屏幕中的远程机器启动 nc

linux - 如何创建自己的 Linux 控制台应用程序?

linux - 编写 awk 命令打印至少有一个字段的每一行

linux - SSH x 通过脚本转发/屏蔽

linux - 在 Bash 脚本中通过管道传入/传出剪贴板

linux - 如何在shell脚本中使用键、值对处理文件

linux - 'mutt' 没有显示完整的主题

Bash - stderr 在 stdout 之前捕获