linux之shell基础
1.变量替换和测试
变量替换
语法 说明
${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除
${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除
${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除
${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除
${变量名/旧字符串/新字符串} 变量内容替换,将第一个匹配到的旧字符串替换成新字符串
${变量名//旧字符串/新字符串} 变量内容替换,将匹配到的所有旧字符串都替换成新字符串
变量测试
| 变量配置方式 | str没有定义 | str为空字符串 | str已定义且非空 |
| var=${str-expr} | var=expr | var= | var=$str |
| var=${str:-expr} | var=expr | var=expr | var=$str |
| var=${str+expr} | var= | var=expr | var=expr |
| var=${str:+expr} | var= | var= | var=expr |
| var=${str=expr} | var=expr | var= | var=$str |
| var=${str:=expr} | var=expr | var=expr | var=$str |
2.字符串
计算字符串长度
| 语法 | 说明 | |
| 方法一 | ${#string} | 无 |
| 方法二 | expr length "$string" | string中有空格时,必须加双引号 |
举例:
[root@VM_0_13_centos ~]# var="Hello World"
[root@VM_0_13_centos ~]# len=${#var}
[root@VM_0_13_centos ~]# echo $len
11
[root@VM_0_13_centos ~]# len=$(expr length "$var")
[root@VM_0_13_centos ~]# echo $len
11
获取子串在字符串中的索引位置
语法 expr index $string $substring
说明 下标从1开始
会将substring子串拆分成一个个字符,然后去匹配string字符串中是否有这些字符,返回最先找到的那个字符的位置
举例
[root@VM_0_13_centos ~]# var="quickstart is app"
[root@VM_0_13_centos ~]# index=$(expr index "$var" uniq)
[root@VM_0_13_centos ~]# echo $index
1
[root@VM_0_13_centos ~]# index=$(expr index "$var" cnk)
[root@VM_0_13_centos ~]# echo $index
4
计算子串长度
语法 expr match $string substr
说明 必须从头开始匹配,如果匹配的是字符串中间的字符则匹配不到
举例
[root@VM_0_13_centos ~]# var="quickstart is app"
[root@VM_0_13_centos ~]# sub_len=$(expr match "$var" app)
[root@VM_0_13_centos ~]# echo $sub_len
0
[root@VM_0_13_centos ~]# sub_len=$(expr match "$var" quick)
[root@VM_0_13_centos ~]# echo $sub_len
5
[root@VM_0_13_centos ~]# sub_len=$(expr match "$var" quick.*)
[root@VM_0_13_centos ~]# echo $sub_len
17
截取子串
| 语法 | 说明 | |
| 方法一 | ${string:positon} | 从string中的position位置开始截取到字符串结尾 |
| 方法二 | ${string:position:length} | 从position开始,匹配长度为length的子串 |
| 方法三 | ${string: -position} | 从右边开始匹配,注意:和-之间必须有空格 |
| 方法四 | ${string:(position)} | 根据position的正负决定从哪边开始匹配 |
| 方法五 | expr substr $string $position $length | 从position开始,匹配长度为length的子串 |
| 说明:使用${string:position}索引计数是从0开始的,使用expr索引计数是从1开始的 | ||
举例
[root@VM_0_13_centos ~]# var="kafka hadoop yarn mapreduce" [root@VM_0_13_centos ~]# substr=${var:10} [root@VM_0_13_centos ~]# echo $substr op yarn mapreduce [root@VM_0_13_centos ~]# substr=${var:10:5} [root@VM_0_13_centos ~]# echo $substr op ya [root@VM_0_13_centos ~]# substr=${var: -5} [root@VM_0_13_centos ~]# echo $substr educe [root@VM_0_13_centos ~]# substr=${var:(-5)} [root@VM_0_13_centos ~]# echo $substr educe [root@VM_0_13_centos ~]# substr=${var:(5)} [root@VM_0_13_centos ~]# echo $substr hadoop yarn mapreduce [root@VM_0_13_centos ~]# substr=${var:(-5):2} [root@VM_0_13_centos ~]# echo $substr ed [root@VM_0_13_centos ~]# substr=$(expr substr "$var" 10 5) [root@VM_0_13_centos ~]# echo $substr oop y
3.命令替换
| 语法格式 | |
| 方法一 | `command` |
| 方法二 | $(command) |
|
备注:$(())主要用来进行整数运算,包括加减乘除,注意与$()的区别
# 获取系统的所有用户并输出 #!/bin/bash for user in $(cat /etc/passwd|cut -d ":" -f 1) do echo $user done # num1=50 # num2=70 # echo “$(($num1+$num2))” 120
# 判断nginx是否存活,不存活拉起nginx进程 #!/bin/bash nginx_process_num=$(ps -ef|grep nginx|grep -v grep|wc -l)
if [ $nginx_process_num -eq 0 ];then systemctl start nginx |
|
4.有类型变量
declare命令和typeset命令两者等价
declare、typeset命令都是用来定义变量类型的
|
参数 |
含义 |
|
-r |
将变量声明为只读 |
|
-i |
将变量声明为整数 |
|
-a |
将变量声明为数组 |
|
-f |
显示此脚本前定义过的所有函数及内容 |
|
-F |
仅显示此脚本前定义过的函数名 |
|
-x |
将变量声明为环境变量(全局变量) |
|
+r +i +a +x |
取消变量的声明 |
|
# declare -i [root@VM_0_13_centos ~]# num1=10 [root@VM_0_13_centos ~]# num2=$num1+10 [root@VM_0_13_centos ~]# echo $num2 10+10 [root@VM_0_13_centos ~]# expr $num1+10 10+10 [root@VM_0_13_centos ~]# expr $num1 + 10 20 [root@VM_0_13_centos ~]# declare -i num3 [root@VM_0_13_centos ~]# num3=$num1+90 [root@VM_0_13_centos ~]# echo $num3 100
# declare -f [root@VM_0_13_centos ~]# declare -f | more __expand_tilde_by_ref () { if [[ ${!1} == \~* ]]; then if [[ ${!1} == */* ]]; then eval $1="${!1/%\/*}"/'${!1#*/}'; else eval $1="${!1}"; fi; fi }
# declare -x [root@VM_0_13_centos ~]# num=30 [root@VM_0_13_centos ~]# echo $num 30 [root@VM_0_13_centos ~]# vim test2.sh #!/bin/bash echo $num [root@VM_0_13_centos ~]# sh test2.sh
[root@VM_0_13_centos ~]# declare -x num [root@VM_0_13_centos ~]# sh test2.sh 30 |
|
5.数组变量
# declare -a [root@VM_0_13_centos ~]# declare -a array [root@VM_0_13_centos ~]# array=("jones" "mike" "kobe" "jordan") # 输出数组内容 [root@VM_0_13_centos ~]# echo ${array[@]} # 输出数组中全部元素 jones mike kobe jordan [root@VM_0_13_centos ~]# echo ${array[0]} jones [root@VM_0_13_centos ~]# echo ${array[1]} mike # 获取数组长度 [root@VM_0_13_centos ~]# echo ${#array} # 获取数组内元素个数 5 [root@VM_0_13_centos ~]# echo ${#array[0]} # 获取数组内索引为0的元素长度 5 # 数组元素赋值 [root@VM_0_13_centos ~]# array[0]="lily" [root@VM_0_13_centos ~]# echo ${array[0]} # 给数组下标索引为1的元素赋值为lily lily [root@VM_0_13_centos ~]# array[20]="hanmeimei" # 在数组尾部添加一个新元素 [root@VM_0_13_centos ~]# echo ${array[@]} lily mike kobe jordan hanmeimei # 删除元素 [root@VM_0_13_centos ~]# unset array[0] # 删除数组中的元素 [root@VM_0_13_centos ~]# echo ${array[@]} mike kobe jordan hanmeimei [root@VM_0_13_centos ~]# unset array # 清空数组 [root@VM_0_13_centos ~]# echo ${array[@]} # 分片访问 [root@VM_0_13_centos ~]# echo ${array[@]:1:3} # 获取数组中索引从1开始到3的元素 mike kobe Jordan # 内容替换 [root@VM_0_13_centos ~]# echo ${array[@]/ob/OB} # 将数组中所有元素包含ob的字符串替换为OB,元素组内容不变 jones mike kOBe Jordan # 遍历数组 [root@VM_0_13_centos ~]# for v in ${array[@]};do echo $v ;done jones mike kobe Jordan
6.bash数学运算
|
bash数学运算之expr(仅支持整数运算) |
|
|
|
语法 |
|
方法一 |
expr $num1 operator $num2 |
|
方法二 |
$(($num1 operator $num2)) |
|
expr比较操作符 |
|
|
操作符 |
含义 |
|
num1 \| num2 |
num1不为空且非0,返回num1;否则返回num2 |
|
num1 \& num2 |
num1不为空且非0,返回num1;否则返回0 |
|
num1 \< num2 |
num1小于num2,返回1;否则返回0 |
|
num1 \<= num2 |
num1小于等于num2,返回1;否则返回0 |
|
num1 = num2 |
num1等于num2,返回1;否则返回0 |
|
num1 != num2 |
num1不等于num2,返回1;否则返回0 |
|
num1 \> num2 |
num1大于num2,返回1;否则返回0 |
|
num1 \>= num2 |
num1大于等于num2,返回1;否则返回0 |
|
[root@VM_0_13_centos ~]# num1=100 [root@VM_0_13_centos ~]# num2=50 [root@VM_0_13_centos ~]# expr $num1 \> $num2 # >在shell中是保留关键字,是数据流重定向的作用,所以想要使用这个符号,需要转义 1 [root@VM_0_13_centos ~]# expr $num1 \< $num2 0 |
|
|
expr算数运算操作符 |
|
|
操作符 |
含义 |
|
num1 + num2 |
求和 |
|
num1 – num2 |
求差 |
|
num1 \* num2 |
求积 |
|
num1 / num2 |
求商 |
|
num1 % num2 |
求余 |
|
[root@VM_0_13_centos ~]# num3=$(expr $num1 + $num2) [root@VM_0_13_centos ~]# echo $num3 150 [root@VM_0_13_centos ~]# num3=$(($num1 + $num2)) [root@VM_0_13_centos ~]# echo $num3 150
[root@VM_0_13_centos ~]# num=10.11 [root@VM_0_13_centos ~]# expr $num + 1 expr: non-integer argument [root@VM_0_13_centos ~]# echo $? 2 [root@VM_0_13_centos ~]# num=10 [root@VM_0_13_centos ~]# expr $num + 1 11 [root@VM_0_13_centos ~]# echo $? 0 |
|
|
bash数学运算之bc(支持浮点数运算,可以通过设置scale设置浮点数的精度) |
|
|
num1 + num2 |
求和 |
|
num1 – num2 |
求差 |
|
num1 \* num2 |
求积 |
|
num1 / num2 |
求商 |
|
num1 % num2 |
求余 |
|
num1 \^ num2 |
指数运算 |
|
[root@VM_0_13_centos ~]# bc 1/20 0 scale=2 1/20 .05
# 非交互式操作 [root@VM_0_13_centos ~]# echo "23.3+24"|bc 47.3 [root@VM_0_13_centos ~]# echo "scale=4;23.3/24"|bc .9708 |
|

浙公网安备 33010602011771号