我正在尝试使用以下格式运行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])。
任何想法我怎么能解决这个问题?任何帮助将非常感谢!
感谢
答案 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