设为首页 收藏本站
查看: 725|回复: 0

Bash Shell编程要点小结

[复制链接]

尚未签到

发表于 2015-12-3 15:00:04 | 显示全部楼层 |阅读模式
一、case命令
  case variable in
value1)

command(s)
;;  value2)

command(s)
;;  *)

command(s)
;;  esac
  如果case变量没有被匹配,程序就执行*)后面的语句。
case值中允许出现Shell通配符和竖线(|)作为OR操作符
二、if命令
  if command
then

command(s)  fi
  if test expression
then

command(s)  fi
  if [ string/numeric expression ]
then

command(s)  fi
  if [[ string/numeric expression ]
then

command(s)  fi
  if ((numeric expression))
then

command(s)  fi
  注意:
1)if命令可以嵌套,在嵌套的情况下,fi命令总是和最近的if配对使用
  2、if/else命令
if command
then

command(s)  else

command(s)  fi
  
  3、if/elif/else命令
if command
then

command(s)  elifcommand

command(s)  elifcommand

command(s)  else

command(s)  fi
注意:
1)elif=else if,但elif不需要fi命令对应了
2)else块被称为默认块
三、eval命令
  eval命令可以对命令行求值,做shell替换,并执行命令行。通常在普通命令行解析不能满足要求时使用。
  例子:
  $ set a b c d
$ echo The last argument is\$$#
The last argument is $4
  $ eval echo The last argument is\$$#
The last argument is d
  cb@cb-K43SV:~$ set -x  //打开bash shell的调试功能
cb@cb-K43SV:~$ eval echo The last argument is \$$#
+ eval echo The last argument is '$4'
++ echo The last argument is d
The last argument is d
四、exit命令
  exit命令结束脚本返回命令行。
exit命令可以带一个返回值参数,0表示顺利退出,否则,非正常退出。
exit命令的返回值保存在$?变量中。
五、IFS域分隔符
  shell的内部域分隔符可以是空格、制表符和换行符,它可以作为命令的分隔符用在read、set、for等命令中。
在修改IFS之前,最好将原始的IFS保存在另一个变量中。
  names=Tom:Dick:Harray:John
OLD_IFS=$IFS
IFS=":"
for persons in $names
do

echo $persons  done
IFS=$OLD_IFS
六、null命令
  null命令用:表示,是一个内建的什么都不做的命令,返回状态值为0(真),通常用来建立无限循环。
例子:
if grep "hello" hello.txt
then

:  else

echo "not found!"   fi
七、shift命令
  shift命令用来把位置参量向左位移指定次数,没有参数的shift命令则把参数变量表向左位移一位。
shift [n]
  while (($#>0))
do

echo $*
shift  done
八、循环命令
  Bash shell有四种循环:for 循环、while循环、until循环、select循环
1、for循环
  for variable in word_list
do

command(s)  done
  例子:
for pal in Tom Dick Harry Joe
do

echo "Hi $pal"  done
  
  for file in memo[1-5]   #world_list可以是正则表达式,但文件必须存在才能展开,否则不展开
do

......  done
  
  for file   #word_list为空,自动循环位置参量,等效于for file in $*
do

......  done
2、while循环
  while循环形式:当command退出状态值为0时,执行循环体内的命令command(s),直到command退出状态值非0
while command
do

command(s)  done
  
  例子:
num=0
while ((num<10))
do

let num+=1
echo "num=$num"  done
  
  while  "$answer" != "Bill Clinton"
do

......  done
  
  while [ -n "$go" ]  #-n:字符串长度非0
do

......  done
  
  while true#true命令是Linux中退出状态值永远为0的命令
do

......  done
3、until循环
  until循环形式:和while循环相反,当command退出值为非0时,执行循环体内的命令command(s),否则,退出循环
until command
do

command(s)  done
  
  例子:
until who | grep linda
do

sleep 5  done
talk linda@dragonwings
  
  num=0
until ((num>10))
do

let num+=1
echo "num=$num"  done
4、select循环
  select循环的主要作用是建立菜单,数字化的菜单显示在标准错误上,PS3(默认为#?)提示用户输入。
输入的是菜单序号,并被保存到REPLY中。
如果REPLY变量为空,将会重新显示菜单。
变量COLUMN表示终端上显示的用select命令建立的菜单的列宽度,默认80。
变量LINES控制菜单在终端上的垂直显示的行数,默认为24;当LINES=1时,菜单将在一行上显示。
break命令或CTL+C退出循环。
  select var in wordlist
do

command(s)  done
  
  例子:
select name in chenjy panda xiaopang
do

echo "name=$name, REPLY=$REPLY"  done
  
  输出:
1) chenjy
2) panda
3) xiaopang
#?
5、break命令
  内建的break命令用来从循环中强形退出,但是不退出程序。
break可以用一个数字作为参数,指定强行退出的循环层数。如果有三层循环,最外层的循环为3,中间的为2,最里层的为1。
break [n]  n默认值为1
6、continue命令
  continue [n] n默认值为1
如果某些条件为真,continue命令控制跳转到循环的顶部,所有continue命令后面的语句都将被忽略。
如果用一个数字作为参数,控制就可以在指定的任何层的循环顶部重新开始执行。如果有三层循环,最外面的循环号为3,中间层为2,最里层为1。
7、循环中的IO重定向
  文件中的输入可以通过管道重定向给一个循环,循环的输出也可以重定向给一个文件或通过管道重定向给其它程序。Shell启动一个子shell来处理IO重定向和管道。
  cat file | while read line
do

echo $line  done >tmp$$
  
  for i in 7 9 2 3 4 5
do

echo $i  done | sort -n
8、后台运行循环
  循环可以在后台运行,程序可以不等待循环结束而连续运行。
  例子:关键字done后面的&使得循环在后台运行。在循环运行的同时,程序继续运行。
  #!/bin/bash
for person in bob jim joe sam
do

mail $person < memo  done &
九、文件检验操作符
  常用文件检验操作符,可分为四类:
1、文件读写执行权限检验
-r filename文件可读
-w filename文件可写
-x filename文件可执行
  2、文件存在检验
-e filename文件存在
-d filename目录存在
-f filename非目录普通文件存在
  3、文件类型检验
-b filename块文件
-c filename字符文件
-L filename符号链接
  4、文件大小检验
-s filename文件尺寸非0
十、陷阱trap命令
  trap命令允许你控制程序在收到信号以后的行为。当接收到指定的信号数字后,就执行trap命令中用引号引用的命令。
信号:由一个进程发送给另一个进程的,或者在特定的健按下后由操作系统发送给进程的,又或者在异常情况下发生时由数字组成的非同步消息。
  trap命令格式:
trap 'command;command' signal-number
trap 'command;command' signal-name
  注意:
1、Shell总共读取两次命令字符串,一次是在设置trap的时候,一次是在信号到达的时候。
2、如果命令字符串被双引号引用,在第一次设置trap时执行变量和命令替换。如果用的是单引号,则等到信号到达trap开始执行时,才看执行变量和命令替换。
3、陷阱的设置对于脚本来说是全局的。
  例子:
1、信号列表
$ trap -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
  2、设置信号陷阱
$ trap 'rm tmp*;exit 1' 0 1 2 15

$ trap 'rm tmp*;exit 1' EXIT HUP INT TERM
  3、忽略信号
$ trap "" 1 2
  4、信号复位:在trap命令后面跟一个信号或者数字,可以把信号复位为默认动作。
$ trap 2

$ trap INT
  5、陷阱嵌套
$ trap 'trap 2' 2
设置用户按两次Control-C终止程序。第一次陷阱捕捉信号,第二个陷阱复位信号2的默认动作-杀死进程
十一、getopts命令
  当脚本需要一些命令行选项时,位置参量不是总有效的,因为有的选项需要指定参数,而位置参量无法区分。
bash内嵌函数getopts能够处理带参数的选项
  1、基本用法
while getopts :xyn: name
do

case $name in
x)
command(s);;
y)
command(s);;
n)
echo "The argument for -n is $OPTARG";;
\?)
command(s);;
esac;  done
  
  说明:
1)x、y和n都是选项。选项x前面有一个冒号:,选项n后面有一个冒号:
2)选项前面的冒号:告诉getopts静默错误报告
3)选项后面的冒号:表示选项需要一个用空格与它间隔开的参数,参数是非破折号开头的单词。-n选项就需要参数。
4)没有破折号的选项告诉getopts已经到了选项清单的末尾。当getopts没有参数可处理时,返回一个非0退出状态值,导致while循环终止。
5)每次调用getopts时,它把从位置参量读取的合法选项赋值给指定的变量(例子中为name),如果不合法,就把问号?赋值给变量。
6)选项参数保存在变量OPTARG中。
7)变量OPTIND初始值为1,并在getopts每处理完一个命令行参数后增加1,因此$OPTIND=$#+1。
  =-=-=-=-=
Powered by Blogilo

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146910-1-1.html 上篇帖子: 通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目) 下篇帖子: Shell脚本初探
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表