shell脚本编程学习笔记——变量

N年前心血来潮把鸟哥linux私房菜一顿学,结果时隔多年功力尽散,事实证明进入工作后,最高效的学习方式还是围绕面临的问题去学习。当然也不是说不用做技术储备,拓宽技术面是必要,但要系统性学习一门技术,最好是用来解决眼下的问题。
最近开始接触ci,发现里面的shell脚本都能看得懂,但要想优化改造就犯难了。需要重新对shell script做个梳理。
shell变量 变量声明

key="value"

  • 与很多其他语言不同,等号左右不能有空格。
  • 变量名称只能使用英文字母,数字和下划线,首个字符不能以数字开头。
变量使用
使用一个已经被定义过的变量时,在变量名前加 $ 符号,可以用{}包含变量名。
name="George"# $变量名 echo "my name is $name"prefix="foot"# ${变量名} echo "i like play ${prefix}ball"

{}是为了帮助解释器识别变量的边界。作为最佳实践,可以为所有变量加上${}
字符串变量
shell变量最常用的数据类型就是字符串。另一种是数组,后面再介绍。
对变量赋值字符串时,支持使用双引号、单引号,也可以不加引号。
可以使用其他变量值对变量赋值
name=George alias=${name}

当变量值中需要包含空格时,需要用引号(单双引号都支持)括起来。不加括号时shell执行会报错。
t1="this is a nice day" t2='yes,it is'# 以下shell执行时会报错 info: command not found。因为shell会把空格后的info当成指令执行 t3=error info

shell定义字符串变量时是支持拼接的,只要各个字符串值之间没有空格。
t1="hi there"# 虽然shell能正常运行以下代码,但可读性太差。 t2=${t1},this" is mike"# 以下代码具备更强的可读性。 t2="${t1},this is mike"

双引号中可以使用${}引用指定变量。而在单引号中,任何字符都会原样输出。
t1="hi there" t2="${t1},this is mike" t3='${t1},this is mike'

以上t2的实际值为"hi there,this is mike",而t3的值为"${t1},this is mike"。
在双引号中,可以通过转译字符 \ 实现单引号相同功能
t1="hi there" t2="\${t1},this is mike"

建议统一使用双引号。
获取字符串长度
name="George"# 使用`${#变量名}`获取变量属性值的长度 echo ${#name}

字符串截位
t1="it's a good day"# 使用${变量名:from:length}获取从from开始,长度为length的字符串 # 以下实例从字符串第 7 个字符开始截取 4 个字符,结果就是"good" echo ${t1:7:4}

数组变量
用括号来表示数组,数组元素用“空格”符号或“回车”分割开。还可以单独定义数组的各个分量。
array1=("value0" "value1" "value2" "value3")array2=( "v0" "v1" "v2" )array2[3]="v3" array2[4]="v4"

读取数组
# ${数组名[下标]} echo ${array1[0]}# 使用 [@] 或 [*] 符号可以获取数组中的所有元素 echo ${array1[@]} echo ${array2[*]}

数组的长度 获取数组长度的方法与获取字符串长度的方法相同
array=(0 1 2 3 4)# 使用`${#数组变量名[@]}`获取数组长度 echo ${#array[@]}

一维数组 shell只支持一维数组(不支持多维数组)
arr1=(1 2 3 4) arr2=(5 6 7 8)# 以下代码并不是构建一个二维数组,而是将两个数组打平后拼接在一起。 arr=(${arr1[@]} ${arr2[@]})# arr实际值为 1 2 3 4 5 6 7 8 echo ${arr[@]}# arr长度为 8 echo ${#arr[@]}

只读变量
name="George" readonly name name="Carol" echo ${name}

通过readonly可将指定变量设置为只读。上面一段shell执行到第三行时,会提示错误:err.sh: line 3: name: readonly variable。
删除字段
unset var_name

【shell脚本编程学习笔记——变量】变量被删除后不能再次使用。unset 命令不能删除只读变量。
参考资料
https://www.runoob.com/linux/linux-shell-variable.html

    推荐阅读