Bash脚本中对val1、val2执行减1操作的实现问题
解决Bash脚本中对read变量执行算术运算的问题
你遇到的问题是因为Bash不会自动把字符串里的val1-1当成算术运算处理,而且单引号内的变量和表达式也不会被解析。这里有两种可行的实现方式:
方法1:直接使用算术扩展$((...))
在Bash中,$((表达式))是标准的整数算术扩展语法,把它嵌入到输出字符串里就能得到正确的计算结果:
while read val1 val2 val3 do echo "ncap2 -Oh -s'TOPOBATHY(($((val1-1)),$((val2-1)))=$val3.'" done < "$tmpdir/tmp1" > "$tmpdir/tmp2"
这里$((val1-1))会让Bash计算出val1减1的结果,再替换到字符串中。另外建议给文件路径加上双引号(比如"$tmpdir/tmp1"),避免路径包含空格时出现错误。
方法2:先计算再代入变量
如果觉得直接嵌入算术扩展可读性差,可以先把计算结果存到新变量里,再用新变量拼接字符串:
while read val1 val2 val3 do # 方式1:用let命令执行算术赋值 let x=val1-1 let y=val2-1 # 方式2:用算术扩展赋值(更推荐) # x=$((val1-1)) # y=$((val2-1)) echo "ncap2 -Oh -s'TOPOBATHY(($x,$y))=$val3.'" done < "$tmpdir/tmp1" > "$tmpdir/tmp2"
为什么原来的写法不行?
你之前的代码里,$val1-1只是简单的字符串拼接,Bash会把它当成[val1的值]-1这样的字符串输出,而不是计算数值;同时如果运算部分放在单引号内的话,Bash不会解析任何变量,只会原样输出val1-1,所以必须用算术扩展语法明确告诉Bash要执行计算。
内容的提问来源于stack exchange,提问作者Nella
相关产品推荐
相关产品推荐

