Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将字符串作为命令行参数传递时,转义如何工作?_Bash_Sed_Awk - Fatal编程技术网

Bash 将字符串作为命令行参数传递时,转义如何工作?

Bash 将字符串作为命令行参数传递时,转义如何工作?,bash,sed,awk,Bash,Sed,Awk,我正在将此格式的日期2013年3月2日传递给awk脚本,我需要获取与此日期匹配的所有记录,如果我不使用脚本直接执行此操作,我必须跳出正斜杠 awk '$4 ~ /02\/03\/2013/ {print $1}' 但是,如果它被作为命令行参数发送,我不必转义它,我使用2013年3月2日运行了该脚本,并且修改了awk命令以适应它 有人能解释一下,当我们将字符串作为命令行参数发送时,字符转义是如何工作的吗?对有害输入采取什么预防措施 非常感谢与此相关的任何在线资源。您可以在bash中使用参数扩展

我正在将此格式的日期2013年3月2日传递给awk脚本,我需要获取与此日期匹配的所有记录,如果我不使用脚本直接执行此操作,我必须跳出正斜杠

awk '$4 ~ /02\/03\/2013/ {print $1}' 
但是,如果它被作为命令行参数发送,我不必转义它,我使用2013年3月2日运行了该脚本,并且修改了awk命令以适应它

有人能解释一下,当我们将字符串作为命令行参数发送时,字符转义是如何工作的吗?对有害输入采取什么预防措施


非常感谢与此相关的任何在线资源。

您可以在bash中使用参数扩展:

date=02/03/2013
date=${date//\//\\/}            # Backslash all slashes.
awk "\$4 ~ /$date/ {print \$1}" # Prevent bash from expanding $1.

可以在bash中使用参数展开:

date=02/03/2013
date=${date//\//\\/}            # Backslash all slashes.
awk "\$4 ~ /$date/ {print \$1}" # Prevent bash from expanding $1.

正斜杠在正则表达式中不是特殊字符。需要对其进行转义的原因是,正则表达式常量使用正斜杠本身作为界限。使用解释为正则表达式的字符串时,不使用这些字符串,因此不需要转义斜杠

awk '$4~dd{print $1}' dd=02/03/2013
也许可以使用精确匹配代替正则表达式匹配

awk '$4==dd{print $1}' dd=02/03/2013

正斜杠在正则表达式中不是特殊字符。需要对其进行转义的原因是,正则表达式常量使用正斜杠本身作为界限。使用解释为正则表达式的字符串时,不使用这些字符串,因此不需要转义斜杠

awk '$4~dd{print $1}' dd=02/03/2013
也许可以使用精确匹配代替正则表达式匹配

awk '$4==dd{print $1}' dd=02/03/2013

不要这样做,这样做既麻烦又容易出错。请参阅@Scrutnizer的答案以了解正确的方法(尽管我会使用-v var=value)。不要这样做,这样做既麻烦又容易出错。有关正确的方法,请参见@Scrutnizer的答案(尽管我会使用-v var=value)。