我正在编写一个脚本,要求用户提供多个选项,然后通过一系列echo语句创建并写入单独的脚本文件。该脚本在执行时还将至少依赖于一个命令行参数。
鉴于原始陈述
if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]
确定第一个参数($1
)是否为整数,如何在保持命令行参数访问权限的同时将echo语句中包含该参数写入新文件?
我试图逃避双引号和美元符号,如
echo "if [ \"` echo \$1 | egrep ^[[:digit:]]+\$`\" = \"\" ]" >> generatePanos
但这只是结果
if [ "" = "" ]
但是,echo "\$1"
会在文件中打印$1
。
答案 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)
至于第一部分,你想要将整个'if'语句回显到文件吗?这就是它的样子。如果没有,那么你应该这样做:
if [ conditions ]; then echo "$1" >> $filename