Shell脚本传入参数无法在内部awk命令中正常执行问题求解
问题成因
- 核心原因是Shell的单引号属于强引用符,内部所有字符都会被视为普通字符串,不会执行Shell变量展开。你代码中awk的执行逻辑被单引号包裹,内部的
$1、$2不会被替换为Shell脚本的入参,只会被awk识别为当前处理行的第1、第2个字段,完全达不到预期的匹配逻辑。 - 原有正则写法不严谨:
/$2/没有指定匹配字段,默认匹配整行内容,当其他字段出现匹配值时会产生误匹配。 - 末尾的文件名参数
$3未加引号,若文件名包含空格等特殊字符会导致命令执行错误。
修复方案
最稳妥的修复方式是通过awk的-v参数将Shell变量传入awk上下文,避免变量作用域冲突:
#!/bin/bash awk -F'\t' -v match_pat1="$1" -v match_pat2="$2" '$1 ~ match_pat1 && $2 ~ match_pat2 {print $1 FS $3}' "$3"
如果你的场景需要完全精确匹配而非正则模糊匹配,可以将正则匹配符~替换为等值判断符==:
#!/bin/bash awk -F'\t' -v match_val1="$1" -v match_val2="$2" '$1 == match_val1 && $2 == match_val2 {print $1 FS $3}' "$3"
修复后执行调用命令bash search.sh 5 AM filename.txt即可输出预期结果。
内容的提问来源于stack exchange,提问作者Rob_Coder_1123
相关产品推荐
相关产品推荐

