Shell 变量


变量用于在shell脚本运行过程中保存数据。


变量赋值

变量赋值(variable assignment)通过赋值运算符(=)将指定值赋给变量。

变量赋值的格式:

变量名=值

s="hello",将hello字符串赋值给变量s。赋值运算符=前后不能有空格,否则就会被当作一个命令执行。

Shell中变量没有类型,所有变量都被当作字符串,但也可以进行算术运算和算术比较。变量不声明也可以使用,没声明的变量的值为空(长度为0的字符串)。

可以通过unset命令将变量的值删除,变量对应的值变成空。

#!/bin/sh
s="hello"
echo $s   # hello
echo $s2  #
unset s
echo $s   #

变量替换

shell中变量只是对应值的占位符,变量替换(variable substitution)指将变量名出现的地方替换成对应的值。通过在变量前面加上$或将变量放在${}的花括号中来做变量替换。

如果能区分变量名,例如变量名后有空格或后面没其他内容,则可以使用$,否则要使用${}

#!/bin/sh
s="hello"
echo "$s"     # hello
echo "$s_2"   #
echo "${s}_2" # hello_2

数字常量

数字常量表示:

  • 没有任何标记的数字是十进制表示,如123
  • 有一个0在数字前面是八进制表示,如017
  • 有0x在数字前面是十六进制表示,如0x1a
  • 有一个数字和#在数字前面是指定进制表示,如2#110,是二进制表示

使用$(())写法进行算术运算。

#!/bin/sh
echo 12         # 12
echo $((017))   # 15
echo $((0x1a))  # 26
echo $((2#110)) # 6

字符串操作

${#var}得到字符串var的长度。

${var:offset:length}得到字符串var的子字符串。offset表示子字符串的在字符串中的开始位置,如果offset为负数,表示从字符串未尾开始。length表示子字符串的长度,如果忽略length,表示到字符串的未尾。

${var/pattern/str}将变量var中第一个匹配pattern的文本替换成str。

${var//pattern/str}将变量var中所有匹配pattern的文本替换成str。

${var/#pattern/str}将变量var开始处匹配pattern的文本替换成str。

${var/%pattern/str}将变量var结尾处匹配pattern的文本替换成str。

#!/bin/sh
s="haha"
echo ${#s}      # 4
echo ${s:1:2}   # ah
echo ${s:1}     # aha

echo ${s/h/k}     # kaha
echo ${s//h/k}    # kaka
echo ${s/#ha/i}   # iha
echo ${s/%ha/i}   # hai

算术运算和算术扩展

使用((算术表达式))命令进行算术运算,使用$((算术表达式))进行算术扩展。

#!/bin/sh
i=2
echo $(( i + 3 ))   # 5
(( i > 1 ?  i *= 2 : i *= 3 ))
echo $i # 4

变量命名规则

  • 变量可以包含字母(a-zA-Z)、数字(0-9)和下划线。
  • 变量名的第一个字符只能是字母或下划线。
  • 变更名中不能包含空格或标点符号。