我可以在bash字符串插值中计算表达式吗?

时间:2018-01-28 15:04:59

标签: linux bash

我试过了:

aaa=10
echo "sdf sdfsd sd ${aaa+=1} sdf sdf "

回来了:

aaa=10
sdf sdfsd sd =1 sdf sdf

bash是否支持以某种方式执行此操作?

2 个答案:

答案 0 :(得分:2)

是。您可以使用$(( expression ))进行算术扩展

echo "sdf sdfsd sd $((myvar+=1)) sdf sdf "
                    ^^        ^^

输出(带有前面的变量赋值myvar=0):

sdf sdfsd sd 1 sdf sdf 

整个标记$(( expression ))在评估后扩展为表达式的结果。因此echo $((1+2))3

表达式评估的另一个非扩展版本(( expr )),根据表达式的评估(非零/零)返回true / false

来自man bash

  

算术扩展

     

算术扩展允许评估算术表达式和结果的替换。算术扩展的格式为:

$((expression))

您必须使用双括号,因为单个括号用于捕获命令的输出:

a=$(echo "hahaha") # a is hahaha
a=$((1+2)) # a is 3

感谢@JohnKugelman指出了语法和联机帮助页的名称

答案 1 :(得分:0)

${parameter+word}是Bash中的一个特殊parameter expansion(也是POSIX所要求的):它代表"如果 parameter 是取消设置,不使用任何内容,否则使用 word 的扩展来代替"。

如果 :+ <,使用{em> + 扩展的word代替parameter的扩展版本有所不同/ em>未设置或null

以下是所有可能的情况:

$ unset myvar
$ echo "${myvar+instead}"    # Unset: print nothing

$ myvar=
$ echo "${myvar+instead}"    # Null: print "instead"
instead
$ myvar=this
$ echo "${myvar+instead}"    # Set and not null: print "instead"
instead
$ unset myvar
$ echo "${myvar:+instead}"   # Unset: print nothing

$ myvar=
$ echo "${myvar:+instead}"   # Null: PRINT NOTHING (effect of :+)

$ myvar=this
$ echo "${myvar:+instead}"   # Set and not null: print "instead"
instead

在您的情况下,由于myvar不为空,您会看到=1

你想要的是arithmetic expansion(见iBug's answer)。

在Bash中,您可以使用前缀增量:

$ var=10
$ for i in {1..3}; do echo "$((++var))"; done
11
12
13

POSIX doesn't require ++--