语法

变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,变量长度没有限制。下面列举了一些变量命名,注意Shell的变量是区分大小写的。

变量有局部变量、环境变量之分。

声明变量

v1=val
# v2 为字符串
declare v2=1
# v2的值为: v2+1
v2=v2+1

# 声明 数字类型
declare -i a=1

# 数组
a2=('v1' 'v2')

# 变量值可以用单号、双引号
v3="a b $a"
v4='a b c'

# 只读变量
readonly r="readOnly"

# 局部变量
f(){
  local v="v"
}

# 执行命令结果
files=$(ls)
files=`ls`
#files的值为:ls 的结果

变量取值

变量名前加 $,也可以 ${v}

v=1
echo $v
echo ${v}

删除变量

v=1
unset v

数组

  • 声明

    # 声明数组
    declare -a a1
    a1[0]=1
    
    # 指定下标数组
    a2=([1]=1 [5]=5)
    
    a=('v1' 'v2')
  • 取值

    # 取值
    echo ${a[0]}
    echo ${a[@]} # 按空格分开打印
    # 结果:v1 v2
    echo ${a[*]} # 输出一个字符串
    # 结果:v1 v2
  • 长度

    # 数组长度
    echo ${#a[@]}
    echo ${#a[*]}
  • 截取、拼接

    # 数组截取
    echo ${a[@]:0:1}
    
    # 接接
    conn=(${a[@]} ${a2[@]})
  • 替换

      # 把a中所有的 v1 替换为 s1
      s=${a[@]/v1/s1}
      echo $s
      # 结果:s1 v2

详细查看:参数扩展

位置参数

位置参数是 shell 脚本传入的参数。

使用数字表示。除了 0

位置参数 N 可以:${N} 或者 $N(一位数字) 使用。

特殊变量

  • *

    不在 ""内,每一个位置参数为一个词输出。则使用word splitting分隔。

    ""内,输出为一个词,相当于 "$1c$2c…"cIFS 中的第一个字符,如果没有设置IFS使用空格,如果 IFSnull,将参数连接,没有间隔符,$1$2…

  • @

    不在 ""内,如果设置了 word splitting,则使用word splitting分隔,如果没设置,使用 空格。

    ""内,"$@" 相当于 "$1" "$2"…

  • #,位置参数的个数

  • $,脚本的进程号。() 子shell中,调shell的进程号,不是子shell的进程号

  • !,最近一个 后台(bakcground)进程的进程号。不管是 异步命令,还是 bg 命令。

  • 0,shell或者脚本的名字。

    如果使用 bash -c 执行,$0 为第一个参数。