关于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 展开
定义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 展开
展开全部
#!/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曾启动的参数。
展开全部
我觉得呢,echo只有加-e选项了才允许后面的输出进行转义,试试下面这样呢?
echo -e 1"$i"2"$j"3"$x"4"$y"5 = $[$var]
此外,还可以试试用单引号(会屏蔽其中特殊字符的特殊含义,仅解释为字符本身,应该就不需要转义了):
a='+ - * /'
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 *命令的结果有何不同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询