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

(3)
xchlinuxxchlinux
上一篇 2018-05-15 11:21
下一篇 2018-05-15 17:24

相关推荐

  • selinux 和 awk的使用

    selinux 和 awk的使用

    Linux笔记 2018-05-15
  • 初学Linux之标准I/O和管道

    标准输入和输出 程序是由指令+数据组成程序的数据流有三种: 输入数据流:<–标准输入(stdin),一般默认是键盘输出数据流:–>标准输出(stdout),一般默认到终端窗口错误输出流:–>标准错误(stderr),一般默认到终端窗口 标准输入:0标准输出:1错误输出:2 I/O重定向:改变默认位置 输出…

    Linux笔记 2018-04-03
  • 浅谈几种IO重定向变形用法

    浅谈几种IO重定向变形用法

    2018-04-05
  • 计算机的组成及其功能

    01.描述计算机的组成及其功能 计算器是由运算器,控制器,存储器,输入装置和输出装置五大部件组成计算机, 每一部件分别按要求执行特定的基本功能。 输入设备  将数据、程序、文字符号、图象、声音等信息输送到计算机中。常用的输入设备有键盘、鼠标、触摸屏、数字转换器等。 输出设备  将计算机的运算结果或者中间结果打印或显示出来。常用的输出设备有:显示器、打印机、绘…

    2018-08-09
  • centos7源码编译实现LAMP

    centos7源码编译实现LAMP 基于php-fpm

    2018-06-24
  • linux下练习及答案

    1.显示当前时间,格式:201-06-18  10:20:30 2.显示前天是星期几 3.设置当前日期为2019-08-07 06:05:10 4、在本机字符终端登录时,除显示原有信息外,再显示当前登录终端号,主机名和当前时间 6.今天19:30自动关机,并提示用户 7.显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录 …

    2018-03-31