shell脚本:判断,循环及数组切片

条件判断:case语句
case 变量引用 in
PAT1)
;;
PAT2)
;;

*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
abc|efg : abc或efg

循环:
while 的特殊用法:
while read LINE;do
file=/path/to/somefile
指令
done < /path/to/somefile
读取文件中的第一行进行处理
$LINK 表示要处理文件的每行
********************************
break 条件成立就退出内循环但会正常执行外循环的后续指令,并进行下一轮的外循环
break 2 :直接退出外循环,退出脚本
continue :
条件成立就跳过本次内循环进行下一轮的内循环;内循环后面的指令不执行但外循环后面的指令可以继续
continue 2 退出内循环continue后面的内,外循环的指令都不执行;开始下一轮的外循环执行
***********************
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done

for 变量名 in 列表 ;do
循环体
done
for后是变量名不是变量引用所以不用加$
in 后面可以用指令“ls /boot” 或通配符不加”“ 位置变量”$@”
for i in {1..10};do
cat >>f1 <<-eof
xxx
eof
done
*****************************
在脚本最后加上wait 则在后台执行的程序时间到会自动终止
let 定义变量时 后面运算结果为0时返回假
let 命令i=0 i++ 则第二次循环会先看i的值再加1,i=0则返回假
let i++ 是先赋值(调用)i的值再加1
let ++i 是i先+1再赋值i
例:
i=3
a=$((i++) 先把i的值赋给a,然后i加1 ,所以a=3,i=4
b=$((++i) 先把i的值加1,i=5,再赋给b,b=5
*********************************
n=10 ;eval echo {1..$n}
eval会先识别{}里面的变量
for i in eval {1..$n};do
don
************************************
pgrep httpd 查看服务是否开启
killall -0 httpd &>/dev/null
-0 发信号检查错误为假则服务没有启动
while : ;do
if killall -0 httpd &>/dev/null ;then
:
else
sysemctl restart httpd
echo at date +%F %T restart httpd >>/path/to/*.logs
将执行记录在目录文件中
fi
sleep 10
done
里面的“:”是什么也不做的意思
************************************
自动创建菜单
PS3=”please choose the var(1-4) : ”
select var in baoyu yanwo ;do
case $var in
baoyu)
echo $var price is 1000
break
;;
yanwo)
….
;;
esac
done
配合case判断
$var :可以是列表中的每一个参数(自动生成)
PS3:提示输入符
选择是1则是把$var赋值为baoyu


数组名称
下标
数值索引:编号从0开始
关联数组:下标可以是任意字符串即关联索引的数组
稀疏格式 :索引不连续
访问数组里的变量要通过数组名和下标
声明数组
declare -a
declare -A 关联数组
普通数组:
数组名 下标 =”变量值”
var[0]=”ceo”
var[1]=”coo”
……
一次性赋值一个元素:
mane=(“mage” ”wang“)
交互式赋值:
read -a var
ceo cto boss
echo ${var[1]} cto
declare -a var
var【2】=ceo
filename=ls /etc
echo ${filename[*]}
同上也可以
filename=(/etc/*)
*********************
稀疏式赋值
关联数组赋值:
显示数组:
echo ${var} 默认是0(ceo)
echo ${var[1]}
echo ${name[0]}为mage
*********************************
查看数组所有元素:
ehco ${数组名[*]}
echo ${数组名[@]}
查看数组元素个数:
echo ${#v数组名【*】}
name[${#name[*]}]=x
给一个数组添加一个新值
name[数组元素个数]=x
unset 数组名 删除数组所有值
********************
字符串切片:
${#var}
: 3 跳过3个
: -3 只取倒数3个(单个负数要加空格)
:3:4 跳过3个取4个
:3:-4 除了前三后4只要中间
echo ${var#*word}
从左到右
#最左边第一个开始到第一次匹配到关键字结束的都删除
word为关键字可以为“:” “ ”空格不用加引号或单个字母
## 贪婪模式
最左边第一个开始到最后一次匹配到关键字结束的都删除
从右到左
echo ${var%:*}
%% 贪婪模式

从右到:左删除{var//root/wang}
贪婪模式配置到的都替换
查找并删除
${var/pattern}:删除var表示的字符串中第一次被pattern匹配到的字符串
${var//pattern}:删除var表示的字符串中所有被pattern匹配到的字符串
${var/#pattern}:删除var表示的字符串中所有以pattern为行首匹配到的字符串
${var/%pattern}:删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
字符大小写转换
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为小写
#开头是
echo ${VAR/#root/wang}
以root开头非贪婪模式
%结尾是
ehco ${var/%root/wang}
以root结尾的替换非贪婪模式

间接变量引用
var=ceo
ceo=wang
eval echo \$$var(相当于$ceo)
wang
echo ${!var}
wang
cmd=hostname
$cmd则直接执行hostname

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98577

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code