Shell基础——变量

声明变量

name=[value]
declare name=[value]

Bash里的变量不仅有值,还有属性。declare命令可以给变量设置属性。

$ declare -i abc=123 # 给变量abc赋予integer属性

声明变量时,如果没有提供value,变量的值为null
变量声明后,只能通过unset命令删除

$ isVarSet () { if [ -v var ];     then echo "var = $var"; fi; }
$ isVarSet
$ var=
$ isVarSet
var =
$ declare -p var
declare -- var=""
$ unset var
$ declare var
$ isVarSet
$ declare -p var
declare -- var
$ unset var
$ declare -p var
-bash: declare: var: not found
$ isVarValueNull () { if [[ $var = $'\0' ]]; then echo "the value of var is null";fi }
$ var=
$ isVarValueNull
the value of var is null
$ var=abc
$ isVarValueNull
$ unset var
$ isVarValueNull
the value of var is null
$ declare var
$ isVarValueNull
the value of var is null
$ isVarDeclared () { if declare -p var &>/dev/null; then echo "var is declared";fi }
$ unset var
$ isVarDeclared
$ declare var
$ isVarDeclared
var is declared
$ unset var
$ isVarDeclared
$ var=
$ isVarDeclared
var is declared

变量赋值

在name=value里,Bash会对value进行~扩展、参数和变量扩展、命令替换、算术扩展和引号删除。如果变量有integer属性,那么变量的值会自动进行算术计算,不需要$((…)) 。

$ echo $var
/home/felix
$ var=$0
$ echo $var
-bash
$ var=$(echo 'abc')
$ echo $var
abc
$ var=$(( 1+2 ))
$ echo $var
3
$ var="abc"
$ echo $var
abc
$ declare -i var
$ var=2*3
$ echo $var
6

+=运算符

$ declare -i var=1
$ var+=2 # +=对具有integer属性的变量是累计计算
$ echo $var
3
$ foo=123
$ foo+=4 # +=对字符串变量的作用是追加字符串
$ echo $foo
1234
$ bar[0]=abc
$ bar+=123
$ echo ${bar[@]}
abc123
$ declare -p bar
declare -a bar=([0]="abc123")
$ bar+=(456)
$ declare -p bar
declare -a bar=([0]="abc123" [1]="456")
$ bar+=789
$ declare -p bar
declare -a bar=([0]="abc123789" [1]="456")
$ declare -A name=([a]=123)
$ name+=345
$ declare -p name
declare -A name=([0]="345" [a]="123" )
$ name+=([b]=456)
$ declare -p name
declare -A name=([0]="345" [b]="456" [a]="123" )

nameref变量

declare的-n选项给变量提供nameref属性,使其成为对另一个变量的引用。
在shell函数中,通常使用nameref来引用参数,等同于对函数参数命名。

$ var=123
$ func () { declare -n ref=$1; echo "ref=$ref"; ref=456; }
$ func var
ref=123
$ echo $var
456

在for in循环里

for name [ [in [words …] ] ; ] do commands; done

如果name有nameref属性,words可以是shell变量列表

$ declare -n ref
$ foo=123
$ bar=abc
$ for ref in foo bar; do echo "ref=$ref"; done
ref=123
ref=abc

虽然nameref属性不能用于数组变量,但可以声明引用数组变量的变量,也可以声明应用数组元素的变量

$ foo=(123 456)
$ declare -p foo
declare -a foo=([0]="123" [1]="456")
$ declare -n ref=foo
$ declare -p ref
declare -n ref="foo"
$ echo ${foo[@]}
123 456
$ echo ${ref[@]}
123 456
$ declare -n refelement=foo[0]
$ declare -p refelement
declare -n refelement="foo[0]"
$ echo $refelement
123

想要删除变量的nameref属性,用unset -n。如果用unset对nameref变量,则销毁被引用的变量,而nameref变量不会被销毁。

$ foo=123
$ declare -n ref=foo
$ unset -n ref
$ declare -p ref
-bash: declare: ref: not found
$ declare -p foo
declare -- foo="123"
$ declare -n ref=foo
$ unset ref
$ declare -p foo
-bash: declare: foo: not found
$ declare -p ref
declare -n ref="foo"
$ foo=456
$ echo $ref
456
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值