shell脚本循环和信号
条件判断
if 条件1;then
COMMAND
elif 条件2;then
COMMAND
else
COMMAND(:) : 表示pass 不执行任何命令
fi
读取用户输入在进行数据判断
echo -n "输入你的数字: "
read userinput
expr $userinput+ &>/dev/null
if [ $? -ne ]; then
echo "必须输入数字!"
continue
else
COMMAND
fi
case 变量引用 in
PAT1)
分支1
;;
esac
变量名和变量引用的区别: 变量引用就是需要在变量名前面添加一个$, name表示变量名 $name表示变量引用
并行执行shell命令 wait的作用是表示后台命令执行完毕后退出程序,默认后台程序结束后需要手动敲回车键才能退出程序
net=172.17.
for i in {..};do
{ if ping -c1 -w1 $net.$i &> /dev/null ;then
echo $net.$i is up
else
echo $net.$i is down
fi; } &
done
wait
循环
for循环
for(( exp1; exp2; exp3 )); do COMMANDS; done
exp1 是循环的初始化语句 实际上不参与循环
exp3 相当于循环体中的最后一条语句
exp2 为循环条件的判断语句 每次执行循环体之前都必须先判断exp2的执行结果
#!/bin/bash
declare -a array
for((i=;i<=;i++))
do
array[$i]=$((RANDOM%))
done MIN=${array[]}
MAX=${array[]} for num in ${!array[@]};do
echo $((array[${num}]))
if [[ ${MIN} -ge ${array[${num}]} ]];then
MIN=${array[${num}]}
fi
if [[ ${MAX} -le ${array[${num}]} ]];then
MAX=${array[${num}]}
fi done
echo "the min is $MIN"
echo "the max is $MAX"
#!/bin/bash
declare -i min max
declare -a nums
for((i=;i<;i++));do
nums[$i]=$RANDOM
[ $i -eq ] && min=${nums[$i]} && max=${nums[$i]} && continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]}
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "all numbers are ${nums[*]}"
echo Max is $max
echo Min is $min
#!/bin/bash
re=`wc -l $ | cut -d " " -f1`
echo $re
continue和break
continue 和 break 后面可以添加一个数字N,表示提前结束第N层的本轮循环从而直接进入下一轮的判断,最内层的循环为第1层
continue 2 or break 3
循环控制shift命令
将参数列表向左移动,默认移动单位为1,移动后的参数会自动被删除.使用的场景:配合循环遍历逐个处理提供给执行脚本的位置参数
while循环的特殊用法
循环遍历文件或者命令的标准输出
df | while read line;do
echo $line
done; while read line;do
echo $line
done < /root/file
select循环与菜单
select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在 标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中
信号捕捉trap
trap '触发指令' 信号 自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
trap '' 信号 忽略信号的操作
trap '-' 信号 恢复原信号的操作
使用 kill -l 查看所有能捕捉的信号数据
trap "echo press ctrl+c" 2
kill -9 的信号无法被捕捉到
[root@iz2ze6e5pr6sbu9qxhzulaz ~]# kill -l
) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP
) SIGABRT ) SIGBUS ) SIGFPE ) SIGKILL ) SIGUSR1
) SIGSEGV ) SIGUSR2 ) SIGPIPE ) SIGALRM ) SIGTERM
) SIGSTKFLT ) SIGCHLD ) SIGCONT ) SIGSTOP ) SIGTSTP
) SIGTTIN ) SIGTTOU ) SIGURG ) SIGXCPU ) SIGXFSZ
) SIGVTALRM ) SIGPROF ) SIGWINCH ) SIGIO ) SIGPWR
) SIGSYS ) SIGRTMIN ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX
父 shell 子 shell export 与 变量传递
一般而言,在一个脚本里执行一个外部命令(普通的可执行文件)时,shell 会 fork 出一个子进程,然后再用 exec 来执行这个程序;但是,bash shell 的内置命令(builtin)却不会这样,它们是直接执行的。所以,等价的内置命令的执行速度会比执行外部命令要来的快
子 shell 对父 shell 里 export 出来的变量进行修改并不能影响到父 shell。这说明了,子 shell 只是在“导出变量列表“里对该变量进行了一个拷贝
子shell中export 出来的变量不能导出到父进程或者是父进程的环境里。一个自己称可以继承父进程的东西,而不能反过来去影响父进程
父子shell中的变量交换本质上是利用进程之间的通信方式来实现的
#!/bin/bash
rm -f tmp.txt
df -h |grep '^/dev*' | while read line;do
name=`echo $line | cut -d" " -f1`
data=`echo $line | cut -d" " -f5`
echo $name-$data >> tmp.txt
done declare -A arr
while read line;do
key=${line%-*}
value=${line#*-}
arr[$key]=$value
done < tmp.txt echo ${!arr[@]}
echo ${arr[@]} [root@centos7 ~]# bash whiledf.sh
/dev/sda1 /dev/sda3 /dev/sda2
% % %
关于export
1.一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);
2.一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
3.不用export定义的变量只对该shell有效,对子shell也是无效的。
shell执行机制
用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序.
shell执行外部命令或运行shell脚本程序时,系统将创建一个子shell,然后在子Shell中执行此Shell脚本
一旦子Shell中的脚本执行完毕,此子Shell随即结束,返回到父Shell中,但不会影响父Shell原本的环境
shell脚本循环和信号的更多相关文章
- shell脚本-循环选择语句
shell脚本-循环选择语句 过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$". if语句 根据命令的退出状态来执行命令 单 ...
- 没事就要多做多练,Shell脚本循环例题做一做
Shell脚本循环例题 一.示例1 二.示例2 三.示例3 四.示例4 ...
- 3.shell脚本循环试题
shell脚本循环试题 1.计算从1到100所有整数的和 #!/bin/bash a=0 for i in {1..100} #1到100 #每次循环变量i的值也为循环次数 do a=$[ $a + ...
- shell脚本循环处理文件数据
有一个日志文件为: # cat data.log 需要提取出里面的数据,写shell脚本实现这个功能: #!/bin/bash OLD=$IFS IFS=$'\n' for entry in $(ca ...
- shell脚本循环嵌套
嵌套循环 在循环语句内使用任意类型的命令,包括其他循环命令,叫做嵌套循环.因为是在迭代中迭代,需要注意变量的使用以及程序的效率问题. 下面举一个for循环嵌套for循环的例子: wangsx@SC-2 ...
- shell脚本循环执行mysql语句
参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...
- shell脚本--循环结构
shell的循环结构有while和for两种 for循环 #!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done echo $ ...
- [Shell] shell 脚本循环恢复的问题
在一个shell脚本中,我大概执行了如下一个脚本: ...} do ...} do ...} do done done done 假设上面的sleep 10秒就是代表我的程序需要执行10秒之久.而现在 ...
- 使用shell脚本循环处理文本
公司是使用puppet来进行配置管理, 某天修改完puppet后领导回复: 我们有一个文档cabinet.txt记录了物理机器所在的机柜, 除了文档里的其他机器都是虚拟机或云服务器, 对虚拟机的pup ...
随机推荐
- Python2.7字符编码详解
目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...
- TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题.
ThreadLoacl,InheritableThreadLocal,原理,以及配合线程池使用的一些坑 TransmittableThreadLocal 原理 之前为了能让InheritableThr ...
- ehcache缓存配置与参数说明
<diskStore path="java.io.tmpdir" /> <defaultCache eternal="false" maxEl ...
- [原]CentOS 7 网卡子接口的创建
OS:CentOS 7 在linux上创建vlan需要加载802.1q模块: 1.检测OS是否已经加载802.1q模块 [root@controller ~]# modinfo 8021q filen ...
- Spark Pipeline
一个简单的Pipeline,用作estimator.Pipeline由有序列的stages组成,每个stage是一个Estimator或者一个Transformer. 当Pipeline调用fit,s ...
- day_5.04py
Pycharm默认不依赖系统环境下安装的requests 打开 File->Settings->Project:你的Project名 点击“+”号 搜索requests并安装 长见识了 # ...
- 安装 powerline
使用说明: https://powerline.readthedocs.io/en/latest/usage.html ~ vim,在 .vimrc 中添加配置 set rtp+=/usr/lib/p ...
- 静态,关键字:static 接口,IUSB , API 接口关键字:interface
//静态 //普通成员 //普通成员是属于对象的 //静态成员 //静态成员属于类的 //关键字:static //self关键字:在类里面代表该类 //在静态方法里面不能调用普通成员 //在普通方法 ...
- 在windows下搭建vueJS开发环境
转自:https://www.cnblogs.com/RexSheng/p/6934413.html nodejs官网http://nodejs.cn/下载安装包,无特殊要求可本地傻瓜式安装,这里选择 ...
- Semver(语义化版本号)扫盲
最近Github 10周年在朋友圈里沸沸扬扬刷屏,小编在工作中却惊讶的发现不少同事对版本号中的beta和rc没有概念,使用 npm install package@next 时,也不清楚next代表的 ...