shell脚本-下篇

shell脚本:

接着上篇的内容所写,若需查看上篇,点击跳转:shell脚本-上篇

脚本定义配置文件:

获取文件内容和变量,主要是函数、变量

例:
echo aa=1234 > file1
vim ts.sh
#!/bin/bash
. file1
echo $aaa

数组:

索引:

索引的编号从0开始,属于数值索引,也叫下标
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)

数组引用:

a=("qq" "ww" "321")
${a[0]}		#取下标为0的值,也就是"qq"

数组声明:

declare -a 数组名
declare -A 数组名	关联数组,也是键值对(必须先声明才能使用)

普通数组赋值:

a[0]="name"
a=("one" "two" three" ...)
a=([0]="one" [3]="three" [4]="four" ...)
read -a 参数		#交互式传参
file=(*.txt) 		#把当前目录下.txt文件加入数组
num=({1..10})

关联数组赋值:

declare -A 数组名

a=([键]="值" [键]="值" ...)	

declare -A name
name[a]=aaa
name[b]=bbb

显示数组中所有值:

${a[*]}
${a[@]}

统计数组长度:

${#a[*]} 
${#a[@]}

数组切片:

${a/[*]:起:止}		#止位可省略
例:
a=(1 e r a g 5)
${a[*]:2:3}		#从第二位取值,到后3位

追加/删除:

a[${#a[*]}]=value
unset a[0]

字符处理:

示例: user=abcdef12345abc456

取字符长度:

${#user}

切片:

${user:起:止}		#正向取,左→右
${user: -起:止}		#反向取,左←右,“-”前面必须空格
${user: -3:-2}

取子串: #支持通配符

${user#a?d}		删除a-d的字符,最短距离匹配,显示剩余的字符
#显示结果: ef12345abc456

${user##a*c}		删除a-c的字符,最长距离匹配
#显示结果: 456

${user%a*}		左←右,删除a以后的字符,最短匹配
#显示结果: abcdef12345

${user%%12*}	 	删除12以后字符,最长匹配
#显示结果: abcdef

替换查找:

${user/abcd/ABCD}	查找user中的字符串,第一次匹配到abcd的地方替换成ABCD
${user//abc/ABC}	所有匹配到abc的地方替换成ABC
${user/#abc/ABC}	行首是abc的替换成ABC
${user/%456/123}	行尾是456的替换成123

查找删除:

${user/abc}		删除第一次匹配到的abc
${user//abcd}		删除所有匹配abc
${user/#abcd}		删除行首匹配abcd
${user/%abcd}		删除行尾匹配的abcd

大小写转换:

$[user^^}		所有字符转大写
${user,,}		所有字符转小写

变量赋值:

${user:~abc}	如果user为空或为设置,返回abc;否则返回user内容;
${usr:=abc}	如果usr为空或未设置,返回abc,并把abc赋值给usr;否则返回usr值
${usr:+abc}	如果usr不空,返回值为abc
${usr:?info}	如果usr为空,返回info(按错误流处理);否则返回usr

循环语句:

列表生成:

{1..10} 
$(seq 起 步长 止)		#止位必须有
ls /var/*`			通配符列表

for:

for语法1:

for i in {1..254} ;do
	{ ping -c 1 1.1.$i }$
done
wait	#等待所有进程结束,sleep是等待一个进程结束

for语法2:

for ((i=1,j=0;i<=100;i++)) ;do
	let j+=i
	echo $j
done

while:

while true; do
	命令
done

while read:

vim xx
12 45 56
23 64

vim ts.sh
#!/bin/bash
while read a b c; do
	echo $a $c
done < xx	#用于逐行读取,只有一个变量时输出一整行,多个变量时,每个变量对应文件一行一列字符

bash ts.sh

until:

until false; do
	...
done

select:

说明:
  • 默认存在两个自带的变量:PS3、REPLY
  • select循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示PS3提示符,等待用户输入
  • 用户输入菜单列表中的某个数字,执行相应的命令
  • 用户输入被保存在内置变量 REPLY 中
  • select是个无限循环,因此要用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c退出循环
  • select 经常和 case 联合使用
  • 与for循环类似,可以省略in list, 此时使用位置参量
vim ts.sh
#!/bin/bash

PS3="请输入名称: "		#PS3变量用于指定提示符
select name in qq ww ee; do
case $REPLY in			#REPLY变量用于存标准输入
	1)
		echo $REPLY	#输出qq
		;;
	2)
		echo $REPLY	#输出ww
		;;
	3)
		echo $REPLY	#输出ee
		;;
	*)
		break
		;;
esac
done
posted @ 2022-01-26 20:57  suyanhj  阅读(62)  评论(0)    收藏  举报