1、变量类型
1.1、全局变量
export ip=10.0.0.1 定义环境变量,在当前shell和子shell有效
1.2、数组变量
#普通数组/关联数组 关联数组索引 可以是字符串
array[0]=1
array[1]=2
${array[@]} 数组所有的元素,以空格隔开
array[$num] 数组某个角标的元素
len=${#array[@]} 数组的长度 {#var}变量var的长度
${!array[@]} 获取数组元素的索引
1.3、位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
1.4、预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的pid
$! 上一个后台进程的pid
$? 上一个命令的返回值,0表示成功
2、变量赋值
2.1、显式赋值
ip=127.0.0.1
name"lms"
time=`date +%F` 命令替换
today=$(date +%F) 命令替换
2.2、read 从键盘读入
read ip
read -p "enter ip: " ip
read -t 3 ip 等待3秒
read -n 2 name 取两个字符
read name sex age 输入三个变量
3、变量的运算
3.1、expr
expr 1 + 2
expr $a + $b
# + - \* / % 注意乘号需要转义
sum =`expr $a + $b`
3.2、$(())
echo $((1+2))
echo $((1-2))
echo $((1*2))
echo $((2**3)) 2的三次方
echo $((1/2))
echo $((a +b )) 变量可以不需要加$
num=$((1/2))
((sum++)) 不需要sum的值时
3.3、$[]
echo $[3+2]
echo $[3-2]
echo $[3*2]
echo $[3/2]
echo $[3%2]
echo $[3**3] 3的3次方
num=$[3/2]
3.4、let
let sum=2+3
let sum+=$i
let i++ 不需要i的值时
4、变量的替换、截取、替代
#去除空格换行符
echo $var |tr -d '\n\r'
url=www.sina.com.cn
#截取
echo ${#url} # 15 变量的长度
echo ${url#www.} #sina.com.cn,截取变量www., 从前往后
echo ${url#*.} #sina.com.cn,截取变量到第一个.。从前往后
echo ${url##*.} #cn。截取变量到最后一个.从前往后
echo ${url%.*} #www.sina.com ,从后往前第一个.
echo ${url%%.*} #www,从后往前,最后一个.
echo ${url:0:5} #www.s,从索引0开始,截取五个字符
echo ${url:5:2} #in,从索引5开始,截取2个字符
echo ${url:5} #ina.com.cn,从索引5开始到结束
##替换
echo ${url/sina/baidu} #www.baidu.com.cn ,替换字符串
echo ${url/n/N} #www.siNa.com.cn ,替换第一个字符n
echo ${url//n/N} #www.siNa.com.cN , 替换所有字符n
#替代
echo ${var1-abc} #var1为空值也不能被替换,只有没被定义时才可以替代
echo ${var1:-abc} #var1为空或为定义都会被替代
#其它
echo ${var3+aaa}
echo ${var3:+aaa}
echo ${var3=aaa}
echo ${var3:=aaa}
echo ${var3?aaa}
echo ${var3:?aaa}
5、注意事项
"" 弱引用 echo "$name" # lms
'' 强引用 不会替换变量 echo '$name' # $name
6、示例
6.1、数组去重
arr=($(echo ${arr[*]} | sed 's/ /\n/g'|sort |uniq))数组去重 sort- u也可以去重