Blog icon indicating copy to clipboard operation
Blog copied to clipboard

shell脚本语言学习 (变量替换 字符串处理 命令替换 有类型变量)

Open jason--liu opened this issue 5 years ago • 0 comments

变量替换

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

jason--liu avatar Jan 09 '20 07:01 jason--liu