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

Bash shell 编程之基础知识概述 (if语句)

[复制链接]

尚未签到

发表于 2018-8-30 09:55:02 | 显示全部楼层 |阅读模式
  来源:http://www.cnblogs.com/stephen-liu74/archive/2011/12/19/2265416.html
  一、Bash shell是什么
  shell是什么,Bash与shell又有什么关系。(以前我也不是特别清楚~~~~)
  shell 是一个交互性命令解释器。shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
  shell是一个命令处理器(command processor)--是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。
  shell拥有自己的语言允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等。用户可以生成像其他应用程序一样复杂的shell程序。
  以下是shell功能的一个汇总:
  查找命令的位置并且执行相关联的程序;
  为shell变量赋新值;
  执行命令替代;
  处理 I/O重定向和管道功能;
  提供一个解释性的编程语言界面,包括tests、branches和loops等语句。
  bash是borne again shell的缩写,它是shell的一种,Linux上默认采用的是bash。当然还有sh,dash,tcsh和ksh等
  1、读入变量(read)
  read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。下面的列表给出了read命令的常用方式:
read从标准输入中读取一行并赋值给特定的变量ERPLY(没有指定变量名的话)read one从标准输入读取并赋值给变量oneread first last从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。read -p打印提示信息,等待输入,并赋值给默认的变量REPLYread -t 设置超时时间(单位:秒)read -a arry_name将输入在清单存入到"arry_name"数组中  read示例:
#无变量,默认存于特定变量REPLY中  
[root@localhost apache]# read    #等待控制台输入,并将结果赋值给特定内置变量REPLY。
  
hello           #控制台输入Hello
  
[root@localhost apache]# echo $REPLY  #打印变量
  
hello
[root@localhost apache]# read one two three  
3 9 8  #输入1 2 3,它们之间用空格隔开。
  
[root@localhost apache]# echo "one is:$one,two is:$two three is:$three"
  
#打印结果
  
one is:3,two is:9 three is:8
[root@localhost apache]# read -p "Please input your name:" name  
#输出"Please input your name"文本提示,同时等待输入,并将结果赋值给name
  
Please input your name:scott
  
[root@localhost apache]# echo "$name"
  
scott
[root@localhost apache]# read -t 4  -p "Enter your nmber:"  
#限时4秒输入,如果过了4秒,将退出不再输入
  
Enter your nmber:[root@localhost apache]# echo $REPLY
  
#结果为空
  2.  状态判断:
  test是Shell中提供的内置命令,主要用于状态的检验,如果结果为0,表示成功,否则表示失败。
[root@localhost apache]# name=scott  
[root@localhost apache]# test $name != scoot
  
[root@localhost apache]# echo $? #测试上一条命令执行状态的返回值,0表示功
  
0
  注意的是test命令不支持Shell中提供的各种通配符
[root@localhost apache]# name=tom  
[root@localhost apache]# test $name = [Tt]om
  
[root@localhost apache]# echo $?
  
1
  test命令还可以中括号予以替换,其语义保持不变
[root@localhost apache]# name=tom  
[root@localhost apache]# [ "$name" = tom  ]
  
[root@localhost apache]# echo $?
  
0
  在Shell中还提供了另外一种用于状态判断的方式:` expr `,和test不同的是,该方式中的表达式支持通配符
[root@localhost apache]# [[ $name==[tT]om ]]  
[root@localhost apache]# echo $?
  
0
  在` expression `中,expression可以包含&&(逻辑与)和||(逻辑或)。
[root@localhost apache]# friend=Jack  
[root@localhost apache]# [[ $name==[tT]om && $friend == "Jack" ]]
  
[root@localhost apache]# echo $?
  
0
  在Shell中还提供了let命令的判断方式: (( expr ))
[root@localhost apache]# a=45  
[root@localhost apache]# b=34
  
[root@localhost apache]# (( a > b ))
  
[root@localhost apache]# echo $?
  
0
  
[root@localhost apache]# (( a == 45 && b == 34 ))
  
[root@localhost apache]# echo $?
  
0
  下面的表格是test命令支持的操作符:
表达式  判断为真的条件
字符串判断结果[ StringA=String ]StringA等于StringB[ StringA==StringB ]StringA等于StringB[ StringA!=StringB ]StringA不等于StringB[ String ]String不为空[ -z String ]String长度为0[ -n String ]String长度不为0逻辑判断[ StringA -a StringB ]StringA和StringB都是真[ StringA -o StringB ]StringA或StringB是真[ !String ]String不为真逻辑判断(复合判断)[[ pattern1 && pattern2 ]]pattern1和pattern2都是真[[ pattern1 || pattern2 ]]pattern1或pattern2是真[[ !pattern ]]pattern不为真整数判断[ intA -eq intB ]intA等于intB[ intA -ne intB ]intA不等于intB[ intA -ge intB ]intA大于等于intB[ intA -lt intB ]intA小于intB[ intA -le intB ]intA小于等于intB[ intA -gt intB ]intA大于intB文件判断中的二进制操作[ fileA -ot fileB ]fileA比fileB旧[ fileA -ef fileB ]fileA和fileB有相同的设备或者inode值[ fileA -nt fileB ]fileA比fileB新文件检验[ -d $file ] or [[ -d $file ]]file为目录且存在时为真[ -e $file ] or [[ -e $file ]]file为文件且存在时为真[ -f $file ] or [[ -f $file ]]file为非目录普通文件存在时为真[ -s $file ] or [[ -s $file ]]file文件存在, 且长度不为0时为真[ -L $file ] or [[ -L $file ]]file为链接符且存在时为真[ -r $file ] or [[ -r $file ]]file文件存在且可读时为真[ -w $file ] or [[ -w $file ]]file文件存在且可写时为真[ -x $file ] or [[ -x $file ]]file文件存在且可执行时为真[ -S $file ] or [[ -S $file ]]测试文件是否存在在并且是否是一个套接字文件[ -h $file ] or [[ -h $file ]]file为链接符且存在时为真[ -p $file ] or [[ -p $file ]] 测试文件是否存在并且是否是一个管道文件  注:在逻辑判断(复合判断中),pattern可以包含元字符,在字符串的判断中,pattern2必须被包含在引号中。
  3.流程控制语句:
  if语句格式如下:
  if语句的后面是Shell命令,如果该命令执行成功返回0,则执行then后面的命令。
  if command;then
  command
  command
  fi
  用test命令测试其后面expression的结果,如果为真,则执行then后面的命令。
  if test expression
  then
  command
  fi
  下面的格式和test expression等同
  if [ string/numeric expression ]
  then
  command
  fi
  下面的两种格式也可以用于判断语句的条件表达式,而且它们也是目前比较常用的两种。
  if ` string expression `
  then
  command
  .........
  fi
  if (( numeric expression ))
  then
  command
  .......
  fi
  示例:
[root@localhost tmp]# cat test2.sh  
#!/bin/bash
  
read -p  "Are you OK(y/n)?" answer
  
#这里的$answer变量必须要用双引号扩住,否则判断将失败
  if [ "$answer" = y -o "$answer" = Y ]
  then
  echo "Glad to see it."
  fi
  
[root@localhost tmp]# bash test2.sh
  
Are you OK(y/n)?y
  
Glad to see it.
  上面的判断还可以替换为:
[root@localhost tmp]# cat test2.sh  
#!/bin/bash
  
read  -p "Are you OK(y/n or Maybe)?" answer
  
#` `复合命令操作符允许其中的表达式包含元字符,这里输入以y或Y开头的任意单词,或Maybe都执行then后面的echo。
  
if [[ $answer == [yY]* || $answer = Maybe ]];then
  echo "Glad to hear it."
  fi
  
[root@localhost tmp]# bash test2.sh
  
Are you OK(y/n or Maybe)?yadfadsf
  
Glad to hear it.
[root@localhost tmp]# cat test3.sh  
#!/bin/bash
  answer="not really"
  if [[ $answer = [Nn]o?( way |t really) ]]
  then
  echo "I am sorry."
  fi
  
[root@localhost tmp]# bash -n test3.sh
  
[root@localhost tmp]# bash test3.sh
  
I am sorry.
  
#对于本示例中的扩展通配符,这里需要给出一个具体的解释。[Nn]o匹配No或no,?( way|t really)则表示0个或1个( way或t really),因此answer变量匹配的字符串为No、no、Not really、not really、No way、no way。
  if/elif/else语句的使用方式和if语句极为相似,其格式如下:
  if command
  then
  command
  elif command
  then
  command
  else
  command
  fi
[root@localhost tmp]# cat test4.sh  read  -p "How old are you?" age
  if [ $age -lt 0 -o $age -gt 120 ]                #(( age < 0 || age > 120 ))
  then
  echo "You are so old."
  elif [ $age -ge 0 -a $age -le 12 ]               #(( age >= 0 && age = 13 && age = 20 && age = 30   && age

运维网声明 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-558775-1-1.html 上篇帖子: Shell编程三剑客之grep正则表达式 下篇帖子: 使用shell脚本实现自动SSH互信功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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