不得不说shell语法是丑陋的,操作是简单高效的,最后一次学习总结shell
字符串删除与替换等常见操作
## 字符串长度
a=1234
echo "${#a}"
expr length "${a}"
## 字符串 索引
expr index ${a} 23 # 拆分 2 3 一个个查找找到第一个匹配的就返回
## 字符串 匹配 有问题?
expr match ${a} 123 # 从头开始匹配 可以联想 match search findall
## substring
echo ${a:2:3} #--> 3,4
echo ${a: -3} # --> 反向,特别注意冒号后有空格
或者写成
echo ${a:(-3)}
echo ${a:(-3):2} # ${} 下标是从 0 开始, expr 却是从1开始,已经无力吐槽!!!丑陋的shell!!!
expr substr ${a} 2 3 -->234
b="I love you! Do you love me?"
echo "${b#*ove}" # 正向非贪婪 删除 到ove截止 --》 you! Do you love me?
echo "${b##*ove}" # 正向贪婪 删除 到ove截止 --》 me?
echo "${b%ove*}" # 反向也就是从右到左非贪婪到ove --》 I love you! Do you l
echo "${b%%ove*}" # 反向也就是从右到左贪婪到ove --》 I
##--替换--##
echo "${PATH/bin/BIN}" # 正向非贪婪替换小写bin -》 大写 BIN
echo "${PATH//bin/BIN}" # 正向贪婪替换小写bin -》 大写 BIN
l
字符串变量测试 很麻烦不做掌握要求
字符串作业
#!/bin/sh
:<<EOF
需求描述:
变量 string="Bigdata process framework is Hadoop,Hadoop is an open source project."
执行脚本后, 打印输出 string字符串变量,并给出用户以下选项:
(1) 打印string长度
(2) 删除字符串中所有的Hadoop
(3) 替换第一个Hadoop为Mapreduce
(4) 替换全部Hadoop为Mapreduce
用户输入数字 1|2|3|4 执行对应项的功能, 输入 q|Q 退出交互模式
EOF
string="Bigdata process framework is Hadoop,Hadoop is an open source project."
while :
do
read -p "请选择要执行的选项:
(1) 打印string长度
(2) 删除字符串中所有的Hadoop
(3) 替换第一个Hadoop为Mapreduce
(4) 替换全部Hadoop为Mapreduce
" choice
echo "choice: ${choice}"
case "${choice}" in
[qQ]) exit;;
1) echo "string长度: ${#string}";;
2) echo "删除字符串中所有的Hadoop: ${string##*Hadoop}";;
3) echo "替换第一个Hadoop为Mapreduce: ${string/Hadoop/Mapreduce}";;
4) echo "替换全部Hadoop为Mapreduce: ${string//Hadoop/Mapreduce}";;
*) echo "请输入 1 or 2 or 3 or 4"
esac
done
命令替换
`command` --> date
$(command) --> ${date}
$(()) <==> $[] # 做数字运算
echo "this is $(date +%Y) year"
this is 2019 year
echo "this is $(($(date +%Y) + 1)) year"
this is 2020 year
echo "this is $[$(date +%Y) + 1] year"
this is 2020 year
num=1
((num++)) --> num=$[num+1] --> num=$(($num+1))
((num--))
在今年已经过了 echo $[$(date +%j) / 7] 天 /7 == 过了的星期数
31
echo $[(365-$(date +%j)) / 7] ==》 今年还剩下星期数
#!/bin/sh
index=1
for user in `cat /etc/passwd|cut -d ":" -f 1`; do
echo "${index} -> ${user}"
index=$((${index}+1))
#index=$[index+1]
done
# 判断 , 拉起守护进程
if [ $(ps -ef|grep nginx|grep -v grep|wc -l) -eq 0 ]; then
echo "0"
systemctl start nginx # 守护进程代码
fi
有类型变量
declare -r var="hello world!" # 只读
declare -i num_3=20 # 声明为整型
declare -f # 把系统提供的所有可用函数以及内容显示
declare -F # 把系统提供的所有可用函数仅仅显示 函数名
declare-a array
## 数组的常见操作 ${#array[@]} --> 数组长度 ${#array[1]} --> 第二个元素的字符长度
一般可以认为数组操作与字符串操作类似
declare -x ==》 export
bash 数学运算