一、变量替换
例1:从头匹配最短删除
[root@localhost ~]# var1="I love you,Do you love me" [root@localhost ~]# echo ${var1#*ov} e you,Do you love me
例2:从头匹配最长删除
[root@localhost ~]# var1="I love you,Do you love me"
[root@localhost ~]# echo ${var1##*ov} e me
例3:后匹配最短删除
[root@localhost ~]# echo ${var1%ov*} I love you,Do you l
例4:从后匹配最长删除
[root@localhost ~]# echo ${var1%%ov*} I l
二、变量测试
expr代表字符串,以下以string代表expr为例
注意使用expr索引下标从1开始
#当变量str未赋值时为string
[root@localhost ~]# echo ${str-string} string
#当变量str为空时为空 [root@localhost ~]# str= [root@localhost ~]# echo ${str-string}
#当变量str赋值后为str的值 [root@localhost ~]# str=123 [root@localhost ~]# echo ${str-string} 123
以下类推,生产环境中不常用
三、计算字符串长度
语法1:${#string}
语法2:expr length “$string”
[root@localhost ~]# var="Hello World" [root@localhost ~]# echo ${#var} 11 [root@localhost ~]# echo `expr length "$var"` 11
四、获取字符串中索引位置
4.1 获取字符的索引
语法:expr index “$string” substr
默认时将start切割成s,t,a,r,t字符依次去在var中查找
所以uniq就被分割成u,n,i,q依次对比var变量中的第一个字符q,所以返回1
#查找start在var中的位置
[root@localhost ~]# var="quickstart is a app" [root@localhost ~]# echo `expr index "$var" start` 6
[root@localhost ~]# echo `expr index "$var" uniq`
1
4.2 获取子串的索引
语法:expr match “$string” substr
字串必须从头开始匹配
[root@localhost ~]# echo $var quickstart is a app [root@localhost ~]# echo `expr match "$var" app` 0 [root@localhost ~]# echo `expr match "$var" quicks` 6 [root@localhost ~]# echo `expr match "$var" quickstart` 10
4.3 抽取字符串中的子串
例1:从第10位提取到最后,索引下标从0开始
效果与例4一样
[root@localhost ~]# var="kafka hadoop yarn mapreduce" [root@localhost ~]# echo ${var:10} op yarn mapreduce
例2:从第10位开始提取5位字符
[root@localhost ~]# echo ${var:10:5} op ya
例3:从右往左提取5个字符,下标从1开始,注意冒号后有空格
[root@localhost ~]# echo ${var: -5} educe
从右往左提取的5个字符中提取长度为2的字符串
[root@localhost ~]# echo ${var: -5:2} ed
例5:从左往右第10个字符开始提取长度为5的字符串
注意使用expr下标从1开始
[root@localhost ~]# echo `expr substr "$var" 10 5` oop y
小练习答案
[root@localhost ShellScript]# cat example.sh #!/bin/bash string="Bigdata process framework is Hadoop,Hadoop is an open source project" function print_tips { echo "***************************************" echo "* (1) 打印string长度 *" echo "* (2) 删除字符串中所有的Hadoop *" echo "* (3) 替换第一个Hadoop为Mapreduce *" echo "* (4) 替换全部Hadoop为Mapreduce *" echo "* (5) 重新打印 *" echo "***************************************" } function len_of_string { echo "${#string}" } function del_hadoop { echo "${string//Hadoop/}" } function rep_hadoop_mapreduce_first { echo "${string/Hadoop/Mapreduce}" } function rep_hadoop_mapreduce_all { echo "${string//Hadoop/Mapreduce}" } print_tips echo "【string=$string】" while true do read -p "Pls input your choice 1|2|3|4|5|q|Q :" choice case $choice in 1) len_of_string ;; 2) del_hadoop ;; 3) rep_hadoop_mapreduce_first ;; 4) rep_hadoop_mapreduce_all ;; 5) print_tips ;; q|Q) exit ;; *) echo "Error,input only in {1|2|3|4|q|Q}" ;; esac done
五、命令替换
$()就是命令替换
$(())里面可以进行算术运算,如$( ( (100+30) /13) )
``和$()是等价的
如:
[root@localhost ShellScript]# num1=50 [root@localhost ShellScript]# num2=70 [root@localhost ShellScript]# echo "$((num1+num2))" 120
例1:遍历用户脚本
-d指定分隔符,默认使用tab键作为分隔符,-f取第几段
cat /etc/passwd | cut –d “:” –f 1
[root@localhost ShellScript]# cat example_1.sh #!/bin/bash index=1 for user in `cat /etc/passwd | cut -d ":" -f 1` do echo "This is $index user: $user" index=$(($index + 1)) done
例2:根据系统时间计算今年或明年
[root@localhost ShellScript]# date 2020年 02月 08日 星期六 20:33:28 CST [root@localhost ShellScript]# date +%Y 2020
[root@localhost ShellScript]# echo "This is $(($(date +%Y)+1)) year" This is 2021 year
例3:根据系统时间获取今年还剩多少星期,已经过了多少星期
data +%j为当前在一年中的多少天
[root@localhost ShellScript]# date +%j 039
以上结果除以7就得到已经过了多少星期
039取39除以7,039除以7会报错
[root@localhost ~]# date=$(date +%j) [root@localhost ~]# echo $(( ${date:1:2} /7 )) 5
脚本输出结果
[root@localhost ShellScript]# sh example_2.sh This year have passed 39 days This year have passed 5 weeks There is 326 days before new year There is 46 weeks before new year
[root@localhost ShellScript]# cat example_2.sh #!/bin/bash date0=$(date +%j) date1=${date0:1:2} echo "This year have passed $date1 days" echo "This year have passed $(( $date1 /7 )) weeks" echo "There is $(( 365-$date1 )) days before new year" echo "There is $(( (365-$date1)/7 )) weeks before new year"
例4:判断nginx进程是否存在,不存在则自动拉起该进程
查看nginx进程
注意最后一条是为ps这条命令显示的进程,实际nginx进程只有两条
[root@localhost ShellScript]# ps -ef |grep nginx
root 33823 1 0 00:44 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 33824 33823 0 00:44 ? 00:00:00 nginx: worker process
root 33978 8776 0 00:45 pts/2 00:00:00 grep --color=auto nginx
过滤掉grep 的进程
[root@localhost ShellScript]# ps -ef |grep nginx | grep -v grep root 33823 1 0 00:44 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 33824 33823 0 00:44 ? 00:00:00 nginx: worker process
统计进程条数
[root@localhost ShellScript]# ps -ef |grep nginx | grep -v grep | wc -l 2
[root@localhost ShellScript]# cat example_3.sh #!/bin/bash #得到进程个数 nginx_process_num=$( ps -ef |grep nginx | grep -v grep | wc -l) #判断 if [ $nginx_process_num -eq 0 ];then systemctl start nginx fi
六、有类型变量
declare命令跟typeset命令申明
两者等价
都是定义变量类型
6.1 参数列表
默认未申明的变量都以字符串处理
[root@localhost ShellScript]# num1=10 [root@localhost ShellScript]# num2=$num1+20 [root@localhost ShellScript]# echo $num2 10+20
虽然num1是字符串,但是num2申明为整型,所以结果会转为整型
[root@localhost ShellScript]# declare -i num2 [root@localhost ShellScript]# num2=$num1+20 [root@localhost ShellScript]# echo $num2 30
使用expr命令计算
[root@localhost ShellScript]# expr $num1 + 10 20
declare -f跟declare -F什么也不显示,可能我的centos7.4系统没有定义函数
换ubuntu,可以看到。
申明环境变量,全局可引用
如果不声明var为环境变量,只能在当前终端使用
[root@localhost ShellScript]# var=1 [root@localhost ShellScript]# declare -x var [root@localhost ShellScript]# sh var.sh 1 #var.sh脚本内容为 #!/bin/bash echo $var
取消申明的环境变量
环境变量var变为普通变量
[root@localhost ShellScript]# declare +x var
6.2 数组
输出数组所有内容
[root@localhost ShellScript]# declare -a array [root@localhost ShellScript]# array=("jones" "mike" "kobe" "jordan") [root@localhost ShellScript]# echo ${array[@]} jones mike kobe jordan
下标是从0开始的
[root@localhost ShellScript]# echo ${array[0]} jones
输出整个数组元素的个数
[root@localhost ShellScript]# echo ${#array[@]} 4
输出第一个元素的长度
[root@localhost ShellScript]# echo ${#array[0]} 5
给数组赋值
array[0]=”lily”
删除元素
unset array[2] unset array
分片访问
显示数组下标索引从1到3的3个元素
${array[@]:1:4}
内容替换
${array[@]/an/AN}
数组遍历
for v in ${array{@}} do echo $v done