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

shell编程中for/while/until循环命令

[复制链接]

尚未签到

发表于 2018-8-18 12:11:51 | 显示全部楼层 |阅读模式
  一、for命令
  在shell编程中,有时我们需要重复执行一直命令直至达到某个特定的条件,bash shell中,提供了for命令,允许你创建一个遍历一系列值的循环,每次迭代都通过一个该系列中的值执行一组预定义的命令。
  for的基本格式:
  for var in list
  do
  commands
  done
  在list中,你提供了迭代中要用的一系列值。在每个迭代中,变量var包含列表中的当前值,第一个迭代会适用列表中的第一个值,第二个迭代使用第二个值,以此类推,直至列表中的所有值都过一遍。
  1.1读取列表中的值
[root@sh shell]# cat for1.sh  
#!/bin/bash
  
for test in aaa bbb ccc ddd
  
do
  
        echo the next state is $test
  
done
  

  
[root@sh shell]# sh for1.sh
  
the next state is aaa
  
the next state is bbb
  
the next state is ccc
  
the next state is ddd
  $test变量的值会在shell脚本的最后一次迭代中一直保持有效,除非你修改了它
[root@sh shell]# cat for1.sh  
#!/bin/bash
  
for test in aaa bbb ccc ddd
  
do
  echo the next state is $test
  
done
  
echo "the last state we visited was $test"
  
test=fff
  
echo "wait. now we're visiting $test"
  

  

  
[root@sh shell]# sh for1.sh
  
the next state is aaa
  
the next state is bbb
  
the next state is ccc
  
the next state is ddd
  
the last state we visited was ddd
  
wait. now we're visiting fff
  1.2读取列表中的复杂值
  在shell脚本中,优势你会遇到难处理的数。下面是个给shell脚本程序员带来麻烦的经典例子:
[root@sh shell]# cat for2.sh  
#!/bin/bash
  
for test in I don't know if this'll work
  
do
  echo "word:$test"
  
done
  

  
[root@sh shell]# sh for2.sh
  
word:I
  
word:dont know if thisll
  
word:work
  解决办法:使用转义符或者双引号
[root@sh shell]# cat for2.sh  
#!/bin/bash
  
for test in I don\'t know if "this'll" work
  
do
  echo "word:$test"
  
done
  

  
[root@sh shell]# sh for2.sh
  
word:I
  
word:don't
  
word:know
  
word:if
  
word:this'll
  
word:work
  记住:for循环假定每一个值都是用空格分割的,如果在单独的数字值中有空格,那么你必须使用双引号来将这些值圈起来。
  1.3从变量读取列表
[root@sh shell]# cat for3.sh  
############################
  
#!/bin/bash
  

  
list="aaa bbb ccc ddd eee"
  
list=$list" Connecticut"
  
for state in $list
  

  
do
  
  echo "Have you ever visited $state"
  
done
  

  

  
[root@sh shell]# sh for3.sh
  
Have you ever visited aaa
  
Have you ever visited bbb
  
Have you ever visited ccc
  
Have you ever visited ddd
  
Have you ever visited eee
  
Have you ever visited Connecticut
  1.4从命令读取值
[root@sh shell]# cat for4.sh  
#!/bin/bash
  
file="/root/shell/states"  #如果是在当前不用绝对路径,file=“states”即可
  

  
for state in `cat $file`
  
do
  
  echo "Visit beautiful $state"
  
done
  

  
[root@sh shell]# sh for4.sh
  
Visit beautiful shanghai
  
Visit beautiful beijing
  
Visit beautiful hangzhou
  
Visit beautiful nanjing
  
Visit beautiful guangzhou
  

  
[root@sh shell]# cat states
  
shanghai
  
beijing
  
hangzhou
  
nanjing
  
guangzhou
  1.5更改字段分隔符

  •   空格;
  •   制表符:
  •   换行符
  如果bash shell在数据中看到了这些字符中任意一个,它就会假定你在列表中开始了一个新的数据段。
  要解决这个问题,你可以在你shell脚本中临时更改IFS环境变量的值来限制一下被bash shell当作字段分隔符的字符。但这种方式有点奇怪,比如,如果你行IFS的值使其只能识别换行符,你必须这么做:
  IFS=$'\n'
  将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。
[root@sh shell]# cat for5.sh  
#!/bin/bash
  
file="states"
  

  
IFS=$'\n'
  
for state in `cat $file`
  
do
  
  echo "Visit beautiful $state"
  
done
  

  
[root@sh shell]# sh for5.sh
  
Visit beautiful shanghai
  
Visit beautiful beijing
  
Visit beautiful hangzhou
  
Visit beautiful nanjing
  
Visit beautiful guang zhou
  
Visit beautiful nan ning
  
Visit beautiful jiang nan
  在处理长脚本中,可能在一个地方需要修改IFS的值,然后忘掉它在脚本中其他地方还原默认值。
  例如:
  IFS.OLD=$IFS
  IFS=$'\n'
  
  IFS=$IFS.OLD
  其他的IFS值,如:在/etc/passwd中可能用到
  IFS=:
  也可以赋值多个IFS:
  IFS=$'\n:;"'
  1.6用通配符读取目录
[root@sh shell]# cat for6.sh  
#!/bin/bash
  
for file in /home/*
  
do
  

  
  if [ -d "$file" ];then
  echo "$file is a directory"
  
  elif [ -f "$file" ];then
  echo "$file is a file"
  
  fi
  

  
done
  

  
[root@sh shell]# sh for6.sh
  
/home/apache-tomcat-8.0.28.tar.gz is a file
  
/home/dir1 is a directory
  
/home/dir2 is a directory
  
/home/fie1 is a file
  
/home/fie2 is a file
  
/home/fie22 is a file
[root@sh shell]# cat for7.sh  
#!/bin/bash
  
for file in /home/* /home/badtest
  
do
  

  
  if [ -d "$file" ];then
  echo "$file is a directory"
  
  elif [ -f "$file" ];then
  echo "$file is a file"
  
  else
  echo "$file doesn't exist"
  
  fi
  

  
done
  
[root@sh shell]# sh for7.sh
  
/home/apache-tomcat-8.0.28.tar.gz is a file
  
/home/dir1 is a directory
  
/home/dir2 is a directory
  
/home/fie1 is a file
  
/home/fie2 is a file
  
/home/fie22 is a file
  
/home/badtest doesn't exist
  二、C语言风格的for命令
  2.1 C语言风格的for命令
  C语言的for命令有一个用来指明变量的特殊方法、一个必须保持成立才能继续迭代的条件,以及另一个为每个迭代改变变量的方法。当指定的条件不成立时,for循环就会停止。条件等式通过标准的数字符号定义。
  for (i=0; i

运维网声明 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.iyunv.com/thread-553426-1-1.html 上篇帖子: shell下一键安装hadoop 下篇帖子: 自动备份数据库的Shell-fasdfasdf
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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