Blog
Blog copied to clipboard
shell脚本语言学习 (变量替换 字符串处理 命令替换 有类型变量)
变量替换
1、${变量#匹配规则} # 从头开始匹配,最短删除
variable_1="I love you ,Do you love me"
var1=${variable_1#*ov}
echo $var1
e you ,Do you love me
2、${变量##匹配规则} # 从头开始匹配,最长删除 贪婪模式
var2=${variable_1##*ov}
echo $var2
e me
3、${变量%匹配规则} # 从尾开始匹配,最短删除
var3=${variable_1%ov*}
echo $var3
I love you ,Do you l
4、${变量%%匹配规则} # 从尾开始匹配,最长删除
var4=${variable_1%%ov*}
echo $var3
I l #只剩下最开始的I l
5、${变量/旧字符串/新字符串} # 替换变量内的旧字符串为新字符串,只会替换第一个
➜ ~ echo $PATH
/home/jason/bin:/home/jason/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
➜ ~ var5=${PATH/bin/BIN}
➜ ~ echo $var5
/home/jason/BIN:/home/jason/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
➜ ~
6、${变量//旧字符串/新字符串} # 替换变量内的旧字符串为新字符串,全部替换
➜ ~ var5=${PATH//bin/BIN}
➜ ~ echo $var5
/home/jason/BIN:/home/jason/.local/BIN:/usr/local/sBIN:/usr/local/BIN:/usr/sBIN:/usr/BIN:/sBIN:/BIN:/usr/games:/usr/local/games:/snap/BIN
字符串处理
计算字符串长度
方法一
${#string}
例子
➜ ~ len=${#PATH}
➜ ~ echo ${len}
方法二
expr length "$string" #string有空格则必须加双引号
例子
➜ ~ len=`expr length "${PATH}"` #~上的反引号 expr索引下标从1开始
➜ ~ echo $len
137
获取子串在字符串中的索引位置
expr index $string $substring
➜ ~ ind=`expr index ${PATH} bin`
➜ ~ echo $ind
11
抽取子串
1.${string:position} 从string中的postion开始,一直到结尾
➜ ~ var1="kafaka hadoop yarn mapreduce"
➜ ~ substr1=${var1:10} #索引下标从0开始
➜ ~ echo $substr1
oop yarn mapreduce
2.${string:position:length} 从string开始,匹配长度为length
➜ ~ substr2=${var1:10:5}
➜ ~ echo $substr2
oop y
3.${string: -position} 从右边开始匹配(-号前面有空格)
➜ ~ substr3=${var1: -5}
➜ ~ echo $substr3
educe
➜ ~ substr4=${var1:(-5)}
➜ ~ echo $substr4
educe
➜ ~
4.${string:(posion)} 从左边开始匹配 5.expr substr $string $position $length 从position开始,匹配长度为length
➜ ~ substr4=${var1:(-5)}
➜ ~ echo $substr4
educe
➜ ~
练习 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退出交互 思路: 1.将不同的功能模块划分,并编写函数 function print_tip function len_of_string function del_hadoop function rep_hadoop_mapreduce_first function rep_hadoop_mapreduce_all 2.实现第一步所定义的函数 3.程序主流程设计
#!/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 "******************************"
}
function len_of_string
{
echo "${#string}"
}
function del_hadoop
{
echo "${string//Hadoop/}" #将所有Hadoop替换为空
}
function rep_hadoop_mapreduce_first
{
echo "${string/Hadoop/Mapreduce}"
}
function rep_hadoop_mapreduce_all
{
echo "${string//Hadoop/Mapreduce}"
}
while true
do
echo "【string=$string】"
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)
rep_hadoop_mapreduce_first
;;
4)
rep_hadoop_mapreduce_all
;;
q|Q)
exit
;;
*)
echo "Error, input only in (1|2|3|4|q|Q)"
;;
esac
done
命令替换
方法一 command` #~反引号 方法二、$(command) 例子1.获取系统的所有用户并输出
# cat /etc/passwd | cut -d ":" -f 1 # -d制定分隔符为: -f field 选择分割后的第一个field
#!/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.根据系统时间计算今年或明年
echo "This is $(date +%Y) year"
echo "This is $(($(date +%Y) + 1)) year"
例子3.根据系统时间获取今年还剩下多少星期,已经过了多少星期
echo "This year have passed $(($(date +%j) / 7)) weeks"
echo "This year have passed $(((365 - $(date +%j)) / 7)) weeks"
# $()是命令替换,$(())是要进行算数运算
例子4. 判断nginx是否存在,若不存在则自动拉起进程
ps -ef | grep systemd | grep -v grep | wc -l # wc -l 统计前面执行结果有多少行
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命令 declare命令和typeset命令两者等价 declare、typeset命令都是用来定义变量类型的 -r 将变量设为只读
var1="hello world"
declare -r var1
var1="adf"
zsh: read-only variable: var1
-i 将变量设为整数
➜ ~ num1=10
➜ ~ num2=$num1+20
➜ ~ declare
➜ ~ echo $num2
10+20 #默认输出都是字符串
➜ ~expr $num1 + 10 #expr告诉shell后面做的是数字运算而不是字符串运算
➜ ~ declare -i num2
➜ ~ echo $num2
30
-a 将变量定义为数组
➜ ~ declare -a array
➜ ~ array=("jones" "mike" "kobe" "jordan")
-a 将变量定义为数组
➜ ~ declare -a array
➜ ~ array=("jones" "mike" "kobe" "jordan")
输出数组内容: echo ${array[@]} 输出全部内容 echo ${array[1]} 输出下标索引为1的内容 获取数组长度: echo ${#array} 数组内元素个数 echo ${#array[2]} 数组内下标索引为2的元素长度 给数组某个下标赋值: array[0]="lily" 给数组索引为1的元素赋值为lily array[20]="hanmeimei" 在数组尾部添加一个新元素 删除元素: unset array[2] 清空元素 unset array 清空整个数组 分片访问: ${array[@]:1:4} 显示数组下标索引从1开始到3的3个元素, 内容替换: ${array[@]/an/AN} 将数组中所有元素内包含kobe的子串替换为mcg 数组遍历:
for v in ${array[@]}
do
echo $v
done
-f 显示此脚本前定义过的所以函数和内容 -F 仅显示此脚本前定义过的函数名 环境中的函数可以直接使用 -x 将变量声明为环境变量 num5=30 declare -x num5 取消声明变量 declare +r declare +i declare +a declare +X