条件判断

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脚本循环和信号的更多相关文章

  1. shell脚本-循环选择语句

    shell脚本-循环选择语句 过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$". if语句 根据命令的退出状态来执行命令 单 ...

  2. 没事就要多做多练,Shell脚本循环例题做一做

    Shell脚本循环例题                 一.示例1                 二.示例2                 三.示例3                 四.示例4 ...

  3. 3.shell脚本循环试题

    shell脚本循环试题 1.计算从1到100所有整数的和 #!/bin/bash a=0 for i in {1..100} #1到100 #每次循环变量i的值也为循环次数 do a=$[ $a + ...

  4. shell脚本循环处理文件数据

    有一个日志文件为: # cat data.log 需要提取出里面的数据,写shell脚本实现这个功能: #!/bin/bash OLD=$IFS IFS=$'\n' for entry in $(ca ...

  5. shell脚本循环嵌套

    嵌套循环 在循环语句内使用任意类型的命令,包括其他循环命令,叫做嵌套循环.因为是在迭代中迭代,需要注意变量的使用以及程序的效率问题. 下面举一个for循环嵌套for循环的例子: wangsx@SC-2 ...

  6. shell脚本循环执行mysql语句

    参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...

  7. shell脚本--循环结构

    shell的循环结构有while和for两种 for循环 #!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done echo $ ...

  8. [Shell] shell 脚本循环恢复的问题

    在一个shell脚本中,我大概执行了如下一个脚本: ...} do ...} do ...} do done done done 假设上面的sleep 10秒就是代表我的程序需要执行10秒之久.而现在 ...

  9. 使用shell脚本循环处理文本

    公司是使用puppet来进行配置管理, 某天修改完puppet后领导回复: 我们有一个文档cabinet.txt记录了物理机器所在的机柜, 除了文档里的其他机器都是虚拟机或云服务器, 对虚拟机的pup ...

随机推荐

  1. Invoke和BeginInvoke理解

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...

  2. python爬虫+使用cookie登录豆瓣

    2017-10-09 19:06:22 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 先获得cookie,然后自动登录豆瓣和新浪微博 系统环境: 64位win10系统,同时装pytho ...

  3. python3安装PIL

    原创    2017-09-29 16:15:27 系统环境: 64位win10系统,同时安装python2.7与python3.6两个版本 安装: PIL是Python平台事实上的图像处理标准库,支 ...

  4. IBM flex system P260

    CMM 机箱管理模块 提供如下功能: 电力控制 风扇管理 机箱和计算节点初始化 交换机管理 诊断:机箱.IO选项和计算节点 资源发现和库存管理 资源告警和监控 机箱和计算节点的电源管理 安全策略管理 ...

  5. .NET Core开发日志——依赖注入

    依赖注入(DI)不是一个新的话题,它的出现是伴随着系统解耦的需要而几乎必然产生的. 在SOLID设计原则中,DIP(Dependency inversion principle)--依赖倒置,规定了& ...

  6. SET ARITHABORT {ON | OFF}讲解

    SET ARITHABORT {ON | OFF} 在查询处理过程中如果出现溢出错误或把零作为除数则查询处理是否该终止如 果为ON 则表示终止查询如果为OFF 则表示返回一个警告信息对于进行算术运 算 ...

  7. Java进阶面试题大集合-offer不再是问题

    Java基础 1.List 和 Set 的区别 2.HashSet 是如何保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)? 4.HashMap ...

  8. webpack dev server 配置 启动项目报错Error: listen EADDRINUSE

    Error: listen EADDRINUSE 0.0.0.0:5601 它的意思是,端口5601被其他进程占用. 切换端口即可解决问题

  9. [daily] docker

    what docker is? https://www.docker.com/what-docker 一: archlinux 安装docker: 我之前装了一个, 然后好久没用, 今天发现不能用了, ...

  10. 过滤器会拦截 前端页面加载 js文件的请求

    学艺不精啊.....之前就总结过博客: JAVA中解决Filter过滤掉css,js,图片文件等问题 结果现在又犯了老错误~ 情况如下: index.jsp 页面的验证码输入栏绑定了异步验证(jQur ...