1. 变量替换
语法 | 解释 |
---|---|
${变量#匹配规则} | 从头开始匹配, 删除最短匹配 |
${变量##匹配规则} | 从头开始匹配, 删除最长匹配(贪婪匹配) |
${变量%匹配规则} | 从尾部开始匹配, 删除最短匹配 |
${变量%%匹配规则} | 从尾部开始匹配, 删除最长匹配(贪婪匹配) |
${变量/旧字符串/新字符串} | 替换变量, 只替换第一个匹配项 |
${变量//旧字符串/新字符串} | 替换变量, 替换所有匹配项 |
示例:
$ var="I love you, Do you love me"
${变量#匹配规则}
$ var1=${var#*ov} # 匹配时从第一个字符开始匹配
$ echo $var1
输出:
e you, Do you love me
${变量##匹配规则}
$ var2=${var##*ov}
$ echo $var2
输出:
e me
${变量%匹配规则}
$ var3=${var%ov*}
$ echo $var3
输出:
I love you, Do you l
${变量%%匹配规则}
$ var4=${var%%ov*}
$ echo $var4
输出:
I l
${变量/旧字符串/新字符串}
$ echo $PATH
输出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$ var5=${PATH/bin/BIN}
$ echo $var5
输出:
/usr/local/sBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
${变量//旧字符串/新字符串}
$ var6=${PATH//bin/BIN}
$ echo $var6
输出:
/usr/local/sBIN:/usr/local/BIN:/usr/sBIN:/usr/BIN:/sBIN:/BIN:/snap/BIN
2. 变量测试
变量测试实际用得较少, 大多都可以通过if-else
替换
变量替换参照表
示例:
var=${str-expr}
1. 没有设置变量
$ unset var
$ echo ${var-expr}
输出:
expr
2. 设置变量, 且变量为空
$ var=
$ echo ${var-expr}
输出:
# 输出空值
3. 设置变量, 且变量非空
$ var=test
$ echo ${var-expr}
输出:
test
3. 字符串处理
计算字符串长度
语法 | 说明 | |
---|---|---|
方法一 | ${# string} |
无 |
方法二 | expr length “$string” | string 有空格,则必须加双引号, (建议加上 "" ) |
示范
$ str=shellLearning
$ echo ${#str}
# 13
$ echo $(expr length "$str")
# 13
获取字符在字符串中的索引位置
$ expr index "$string" $substring
$ var="kubernetes is popular"
$ idx=`expr index "$var" t` # var 中有空格, 加 ""
$ echo $idx
# 8
$ idx=`expr index "$var" te` # 子串会被拆成一个个字符一次匹配, 返回第一个匹配
$ echo $idx
# 4
获取子串长度
$ expr match "$var" substr
# 子串必须从头第一个字符开始匹配
$ var="kubernetes is popular"
$ idx=`expr match "$var" popu`
$ echo $idx
# 0
$ idx=`expr match "$var" ku.*`
$ echo $idx
# 21
抽取子串
语法 | 说明 |
---|---|
${string:position} | 从 string 中 position 开始到结尾 |
${string:position:length} | 从 string 中 position 开始, 匹配长度为 length |
${string: -position} | 从右边开始匹配 |
${string:(position)} | 从左边开始匹配 |
expr substr “$string” $position $length | 从 string 中 position 开始, 匹配长度为 length |
:
索引从 0 开始expr 索引从 1 开始
$ var="kubecetes istio etcd operator"
$ substr=${var:7}
$ echo $substr
# es istio etcd operator
$ substr=${var:7:6}
$ echo $substr
# es ist
$ substr=${var: -7}
$ echo $substr
# perator
$ substr=${var:(-7)}
$ echo $substr
# perator
$ substr=`expr substr "$var" 7 6`
# tes is
脚本练习
思路:
- 根据功能划分, 编写响应函数
- 实现定义函数
- 主流程设计
#!/bin/bash
#
str="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 "************************************"
}
function len_of_string
{
echo "${#str}"
}
function del_hadoop
{
echo "${str//Hadoop/}"
}
function replace_hadoop_mapreduce_first
{
echo "${str/Hadoop/Mapreduce}"
}
function replace_hadoop_mapreduce_all
{
echo "${str//Hadoop/Mapreduce}"
}
while true
do
echo "[string: $str]"
echo
print_tips
read -p "Please input your choice(1|2|3|4|q|Q): " choice
case $choice in
1)
len_of_string
;;
2)
del_hadoop
;;
3)
replace_hadoop_mapreduce_first
;;
4)
replace_hadoop_mapreduce_all
;;
q|Q)
exit
;;
*)
echo "Error input, only {1|2|3|4|q|Q}"
;;
esac
done
4. 命令替换
- 使用 `command`
- 使用
$(command)
示例
获取系统所有用户
#!/bin/bash
#
index=1
for user in `cat /etc/passwd | cut -d ":" -f 1`
do
echo "This is $index user: $user"
index=$(($index+1)) # ((index++))
done
获取年份
$ echo $(($(date +%Y) + 1))
# 2024
# 等价
$ echo $((num1+num2))
$ echo $(($num1+$num2))
计算星期
#!/bin/bash
#
echo "Today is the $(date +%j) of year."
echo "This year has passed $(($(date +%j) / 7)) weeks"
echo "This year has $(((365-$(date +%j)) / 7))"
判断进程是否存活
#!/bin/bash
#
nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_num -eq 0 ]; then
systemctl start nginx
fi
有类型变量
declare 与 typeset 命令
两者等价
declare 命令参数表:
与之相反, 取消变量, 把
-
改为+
5. Bash 数学运算
expr 与 $(())
$(()) : 只可用于加减乘除
参数表
$ num1=17
$ num2=5
$ expr $num1 + $num2
# 22
$ expr $num1 - $num2
# 12
$ expr $num1 \* $num2
# 85
$ expr $num1 / $num2
# 3
$ expr $num1 % $num2
# 2
$ expr $num1 \> $num2 # 真为 1, 假为 0
# 1
$ expr $num1 \< $num2
# 0
练习:
#!/bin/bash
#
while true
do
read -p "Pls input a integer: ": num
expr $num + 1 &> /dev/null # expr 只支持整数
if [ $? -eq 0 ]; then
if [ `expr $num \> 0` -eq 1 ]; then
for((i=1;i<$num;i++))
do
sum=`expr $sum + $i `
done
echo "1+2+...+$num = $sum"
exit
else
echo "error not positive"
fi
else
echo "error inlegle input"
fi
done
bc 只支持指数运算
$ echo "7.6/3.7" | bc
# 2
$ echo "scale=4;7.6/3.7" | bc # bc 中 scale 为精度
# 2.0540