逃避〜!在awk(bash命令)中,反斜杠不是最后一个字符

时间:2016-09-27 03:18:06

标签: linux bash shell awk

我正在尝试使用以下格式运行bash命令:

declare "test${nb}"="$(cat file.txt | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}')"

其中$ nb是一个int(例如2),file.txt包含一个包含各种数字和字符串值的表(如果需要,我可以提供更多详细信息,但这里不应该相关)

运行时,shell替换!〜替换我拥有的文件的名称(不确定原因)。我尝试使用反斜杠来逃避这个:

declare "test${nb}"="$(cat file.txt | awk '{if($3>0.5 && $3 \!~ "ddf") $2="NA"; print $1,$2}')"

然后我收到了这个错误:

awk: {if($3>0.5 && $3 \!~ "ddf") $2="NA"; print $1,$2}
awk:                  ^ backslash not last character on line

我也尝试将表包含在变量“var”中并以这种方式编写:

declare test[$nb]=$(echo "$var" | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}')

然后没有错误,但输出只是表的第一列的第一个字段,当我不扩展变量名时不是这种情况。例如,如果我这样做:

declare test2=$(echo "$var" | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}')

然后它完美运行,test2具有预期值。但我需要能够使用任何数字而不是2(类似于测试[$ nb])。

任何想法我怎么能解决这个问题?任何帮助将非常感谢!

感谢

2 个答案:

答案 0 :(得分:2)

丢失引号:

$rbp+4

您的语句还有很多其他问题,包括UUOC,使用标量来模拟数组,非惯用的awk语法等等。试试这个:

$ declare x="$( echo '!' )"
-bash: !': event not found
$ declare x=$( echo '!' )
$ echo "$x"
!

答案 1 :(得分:1)

您是在谈论以交互方式输入命令,还是从文件(即脚本)运行命令? !〜的历史扩展仅在交互式使用中发生。 BTW,bash手册页说:如果启用,将执行历史记录扩展,除非!出现在双引号中使用反斜杠进行转义。之前的反斜杠! 已删除。

这意味着,只要您编写脚本(或者更精确,只要您没有交互式shell),您就不必担心“!”的这种特殊含义。

如果您有一个交互式shell并且历史记录扩展困扰您,您可以通过

将其关闭
set +H