如何在echo语句中包含bash命令行参数

时间:2012-06-21 22:27:18

标签: bash escaping

我正在编写一个脚本,要求用户提供多个选项,然后通过一系列echo语句创建并写入单独的脚本文件。该脚本在执行时还将至少依赖于一个命令行参数。

鉴于原始陈述

if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]

确定第一个参数($1)是否为整数,如何在保持命令行参数访问权限的同时将echo语句中包含该参数写入新文件?

我试图逃避双引号和美元符号,如

echo "if [ \"` echo \$1 | egrep ^[[:digit:]]+\$`\" = \"\" ]" >> generatePanos

但这只是结果

if [ "" = "" ]

但是,echo "\$1"会在文件中打印$1

4 个答案:

答案 0 :(得分:1)

由于你使用的是bash,你可以使用bash的内置正则表达式:

if [[ $1 =~ ^[[:digit:]]+$ ]]; then 
   ...
fi

即使没有bash的内置正则表达式,也不需要测试命令([)或echo

if grep -q -E '^[[:digit:]]+$' <<< "$1"; then
   ...
fi

如果这也必须适用于bash以外的shell,那么你可以保留echo

if echo "$1" | grep -q -E '^[[:digit:]]+$'; then
   ...
fi

最后两个工作因为if测试命令的退出状态。如果未找到匹配,则grep命令返回非零值。

答案 1 :(得分:0)

在每个违规字符前加上一个反斜杠:echo if [\“`echo $ 1 \ | egrep ^ [[:digit:]] + $`\”= \“\”]

答案 2 :(得分:0)

我不完全确定你的意思,但这里有两件事你可以尝试:

如果您尝试按原样打印整行(包括$1),请使用单引号告诉echo不要解释任何内容:

$ echo 'if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]'
if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]

如果您尝试打印整行,而是替换$1的当前值:

$ echo "if [ \"\` echo $1 | egrep ^[[:digit:]]+\$\`\" = \"\" ]"
if [ "` echo <<some value>> | egrep ^[[:digit:]]+$`" = "" ]

如果您尝试替换反引号中的命令的整个部分(使用当前值$1进行评估),则最好使用中间变量:

temp=$(echo $1 | egrep ^[[:digit:]]+$)
echo "if [ \"$temp\" = \"\" ]"

答案 3 :(得分:-1)

回声“\ $ 1”应该完全按照你所说的去做 要回显'1'的内容,然后回显$ 1(没有反斜杠)。
在bash脚本中使用变量时,通常应该对它们进行双引号(echo“$ 1”,func_name“$ 1”等)或者对它们进行转义(echo“$ {1}”)。

至于第一部分,你想要将整个'if'语句回显到文件吗?这就是它的样子。如果没有,那么你应该这样做:

if [ conditions ]; then echo "$1" >> $filename