0

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

鉴于原始陈述

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

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

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

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

但这只是导致

if [ "" = "" ]

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

4

4 回答 4

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命令返回非零值。

于 2012-06-21T22:35:17.683 回答
0

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

于 2012-06-21T22:33:55.430 回答
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\" = \"\" ]"
于 2012-06-21T22:35:27.023 回答
-1

echo "\$1" 应该完全按照您所说的去做。
要回显“1”的内容,然后回显 $1(不带反斜杠)。
在 bash 脚本中使用变量时,最好将它们加双引号(echo "$1"、func_name "$1" 等)或转义它们(echo "${1}")。

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

if [ conditions ]; then echo "$1" >> $filename
于 2012-06-21T22:39:02.570 回答