关于shell脚本变量设定的问题

在下面的脚本中定义a="+-\*/"后,打印输出var的时候\*总是不能转义而报错-bash:1+2+3+4\*5:syntaxerror:invalidarithmet... 在下面的脚本中
定义a="+ - \* /" 后,打印输出var的时候\*总是不能转义而报错
-bash: 1+2+3+4\*5: syntax error: invalid arithmetic operator (error token is "\*5")

但是经过如果不定义a变量,而是每次都写 for i in + - \* / ,就不会报错
哪位高手能解释一下?

#!/bin/bash
a="+ - \* /"
for i in $a
do
for j in $a
do
for x in $a
do
for y in $a
do
var=1"$i"2"$j"3"$x"4"$y"5
echo 1"$i"2"$j"3"$x"4"$y"5 = $[$var]
done
done
done
done
展开
 我来答
verydz1012
2013-06-17 · TA获得超过143个赞
知道答主
回答量:98
采纳率:0%
帮助的人:104万
展开全部
#!/bin/bash 
#来自DZ动力(verydz.com),代码第二行改为如下试下
 
a="+ - * /"
set -f
追问
按照你说的 成功了, 请问set -f 是什么意思
追答
set
功能说明:设置shell。

语 法:set [+-abCdefhHklmnpPtuvx]

补充说明:set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。

参 数:
-a 标示已修改的变量,以供输出至环境变量。
-b 使被中止的后台程序立刻回报执行状态。
-C 转向所产生的文件无法覆盖已存在的文件。
-d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e 若指令传回值不等于0,则立即退出shell。
-f 取消使用通配符。
-h 自动记录函数的所在位置。
-H Shell 可利用"!"加的方式来执行history中记录的指令。
-k 指令所给的参数都会被视为此指令的环境变量。
-l 记录for循环的变量名称。
-m 使用监视模式。
-n 只读取指令,而不实际执行。
-p 启动优先顺序模式。
-P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t 执行完随后的指令,即退出shell。
-u 当执行时使用到未定义过的变量,则显示错误信息。
-v 显示shell所读取的输入值。
-x 执行指令后,会先显示该指令及所下的参数。
+ 取消某个set曾启动的参数。
百度网友5311d79
2013-06-16 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3238万
展开全部
我觉得呢,echo只有加-e选项了才允许后面的输出进行转义,试试下面这样呢?
echo -e 1"$i"2"$j"3"$x"4"$y"5 = $[$var]

此外,还可以试试用单引号(会屏蔽其中特殊字符的特殊含义,仅解释为字符本身,应该就不需要转义了):
a='+ - * /'
追问
应该和 echo转义没有关系, 这句不改只改上面 就能得到正确结果
而且echo的转义应该是转义 \n \t 这类分隔符
追答
实践了一下,发现使用了变量a,传递的是 \* ;而直接传递的话,传递的是 *。区别就是这个。
而bash里$[$var]这种计算方式,跟$((var))这种计算方式类似,*是被允许的,而 \* 则会报错。

用调试方式运行脚本 sh -x script.sh 可以看到这个区别。
具体为什么,还真不好解释,取决于shell的解释方式。
通过变量a来传递的话只能在运算前手动转换一下:
[ "$i" = "\*" ] && i='*'
[ "$j" = "\*" ] && j='*'
[ "$x" = "\*" ] && x='*'
[ "$y" = "\*" ] && y='*'

--------------------------------------
set -f
Disable pathname expansion
可以避免通配符*被展开为文件路径。我的确没想到这个。
在命令行可以试试用set -f前后ls *命令的结果有何不同。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式