1、变量类型
1.1、全局变量
export ip=10.0.0.1 定义环境变量,在当前shell和子shell有效
1.2、数组变量
#普通数组/关联数组 关联数组索引 可以是字符串array[0]=1array[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.1name"lms"time=`date +%F` 命令替换today=$(date +%F) 命令替换
2.2、read 从键盘读入
read ipread -p "enter ip: " ipread -t 3 ip 等待3秒read -n 2 name 取两个字符read name sex age 输入三个变量
3、变量的运算
3.1、expr
expr 1 + 2expr $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+=$ilet 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 ,替换第一个字符necho ${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也可以去重