shell编程_for in 循环
shell循环详解及实例
shell循环详解及实例⼀、条件选择、判断(if、case)1.1 if语句⽤法及实例当我们在脚本中遇到需要判断的时候,我们就可以⽤if语句来实现。
具体的语法如下:单分⽀if 判断条件;then 条件为真的分⽀代码 fi双分⽀if 判断条件; then条件为真的分⽀代码else条件为假的分⽀代码fi多分⽀if 判断条件1; then条件为真的分⽀代码elif 判断条件2; then条件为真的分⽀代码elif 判断条件3; then条件为真的分⽀代码else以上条件都为假的分⽀代码fi在多分⽀中,系统会逐条判断你写⼊的条件,第⼀次遇到“真”条件时,执⾏该分⽀,⽽后结束整个if语句。
注意:1、if和fi是成对出现的2、if语句可以嵌套。
Example:1)判断两个数字的⼤⼩1 #!/bin/bash2 #定义变量3 read -p "Please input the first num:" num14 read -p "Please input the second num:" num25 #判断数字是否符合标准6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then7 # 判断两个数字的⼤⼩并输出判断结果8 if [ $num1 -lt $num2 ];then9 echo "The num2 is biger than the num1"10 elif [ $num1 -eq $num2 ];then11 echo "Two numbers equal"12 else13 echo "The num1 is biger than the num2"14 fi15 else16 echo "Please enter the correct number"17 fi1819 #删除变量20 unset num1 num22)编写脚本/root/bin/createuser.sh,实现如下功能:使⽤⼀个⽤户名做为参数,如果指定参数的⽤户存在,就显⽰其存在,否则添加之;显⽰添加的⽤户的id号等信息1 #!/bin/bash2 #定义变量3 read -p "请输⼊⼀个⽤户名:" name4 #判断⽤户名是否存在5 if `id $name &> /dev/null`;then6 # 若存在,则输出ID等信息7 echo "⽤户存在,⽤户的ID信息为:`id $name`"8 else9 # 若不存在,则添加⽤户,设置密码为随机8位,下次登录时提⽰修改密码,同时显⽰ID等信息10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`11 `useradd $name &> /dev/null`12 `echo "$passwd" | passwd --stdin $name &> /dev/null`13 echo "⽤户名:$name 密码: $passwd" >> user.txt14 `chage -d 0 $name`15 echo "⽤户已添加,⽤户的ID信息为:`id $name` 密码为:$passwd"16 fi1718 #删除变量19 unset name passwd1.2 case⽤法及实例当涉及到多个条件匹配的时候,我们⽤if可能就很⿇烦了,这个时候,我们就可以⽤case来编写这个脚本。
shell中的for、while循环及if语句
shell中的for、while循环及if语句shell与其他语⾔⼀样也⽀持for、while循环for循环的⼀般格式如下:1 #!/bin/sh23for变量in列表4do5 command 16 command 27 command 18 .........9 command n10done列表是⼀组值(数字、字符串等)组成的序列,每个值通过空格分隔。
每循环⼀次,就将列表中的下⼀个值赋给变量。
列表也可以是⼀个⽂件:in 列表是可选的,如果不⽤它,for 循环使⽤命令⾏的位置参数。
1 #!/bin/sh23for line in12345674do5echo"line is $line"6done结果:[root@localhost 1st]# sh test.shline is 1line is 2line is 3line is 4line is 5line is 6line is 7下⾯⽤for循环读⼀个⽂件:查看⽂件内容1 [root@localhost 1st]# cat test.txt2 hello3 wolrd4 hello5 shell6 [root@localhost 1st]#code:1 #!/bin/sh23 FILE=./test.txt45for line in $(<$FILE)6do7echo"line is: $line"8doneResults:1 [root@localhost 1st]# sh xx.sh2 line is: hello3 line is: wolrd4 line is: hello5 line is: shell6 [root@localhost 1st]#while循环的⼀般格式如下:1while command2do34 statement56done3 i=04sum=05while [ $i -le 100 ]6do7sum=$(($sum + $i))8 i=$(($i + 1))9done10echo"sum is $sum"rusults:1 [root@localhost 1st]# sh xx.sh2sum is 50503 [root@localhost 1st]#if语句的⼀般格式如下:1if ....; then2 ....3elif ....; then4 ....5else6 ....7fiif 条件语句:⽂件表达式:1 [ -f "somefile" ] : 判断是否是⼀个⽂件2 [ -x "/bin/ls" ] : 判断/bin/ls是否存在并有可执⾏权限3 [ -n "$var" ] : 判断$var变量是否有值4 [ "$a" = "$b" ] : 判断$a和$b是否相等5 -r file ⽤户可读为真6 -w file ⽤户可写为真7 -x file ⽤户可执⾏为真8 -f file ⽂件为正规⽂件为真9 -d file ⽂件为⽬录为真10 -c file ⽂件为字符特殊⽂件为真11 -b file ⽂件为块特殊⽂件为真12 -s file ⽂件⼤⼩⾮0时为真13 -t file 当⽂件描述符(默认为1)指定的设备为终端时为真字符串表达式:[string string_operator string]这⾥string_operator可为如下⼏种:1 = 两个字符串相等。
shell编程_for_in_循环
for in格式for无$变量in字符串do$变量done一简单的字符串枚举遍历法,利用for in格式对字符串按空格切份的功能SERVICES="8022251108000232021 3306"for x in$SERVICESdoiptables-A INPUT-p tcp--dport$x-m state--state NEW-j ACCEPTdonefor variable in values--------字符串数组依次赋值#!/bin/shfor i in a b c字符串列表A B C字符串用空格分隔,没有括号,没有逗号,然后循环将其依次赋给变量i变量没有$doecho"i is$i"done[macg@machome~]$sh test.shi is ai is bi is cfor in里,变量和*不等价#!/bin/bashfor i in*.h;docat${i}.hdone[macg@vm test]$./tip.shcat:*.h.h:No such file or directory$i代表的是整个路径,而不是*.h里的.h前面的部分改正#!/bin/bashfor i in*.hdocat$idone[macg@vm test]$echo hahaha>>1.h[macg@vm test]$echo ha>>2.h[macg@vm test]$./tip.shhahahaha例2:for i in/etc/profile.d/*.sh do$idone$i代表的是/etc/profile.d/color.sh, /etc/profile.d/alias.sh, /etc/profile.d/default.shfor in对(命令行,函数)参数遍历test(){local ifor i in$*;doecho"i is$i"done}$*是字符串:以"参数1参数2..."形式保存所有参数$i是变量i的应用表示[macg@machome~]$sh test.sh p1p2p3p4i is p1i is p2i is p3i is p4for in语句与通配符*合用,批量处理文件批量改文件名[root@vm testtip]#lsaaa.txt ccc.txt eee.txt ggg.txt hhh.txt jjj.txt lll.txt nnn.txtbbb.txt ddd.txt fff.txt go.sh iii.txt kkk.txt mmm.txt ooo.txt[root@vm testtip]#cat go.shfor i in*.txt*.txt相当于一个字符串数组,依次循环赋值给idomv"$i""$i.bak"done[root@vm testtip]#sh go.sh[root@vm testtip]#lsaaa.txt.bak ccc.txt.bak eee.txt.bak ggg.txt.bak hhh.txt.bak jjj.txt.bak lll.txt.bak nnn.txt.bakbbb.txt.bak ddd.txt.bak fff.txt.bak go.sh iii.txt .bak kkk.txt.bak mmm.txt.bak ooo.txt.bakfor in语句与``和$()合用,利用``或$()的将多行合为一行的缺陷,实际是合为一个字符串数组for i in$(ls*.txt)doecho$idone[macg@machome~]$sh test111-tmp.txt111.txt22.txt33.txt或者说,利用for in克服``和$()的多行合为一行的缺陷利用for in自动对字符串按空格遍历的特性,对多个目录遍历LIST="rootfs usr data data2"for d in$LIST;domount/backup/$drsync-ax--exclude fstab--delete/$d//backup/$d/ umount/backup/$ddone。
shell脚本中的4种循环语句使用
shell脚本中的4种循环语句使⽤1、for循环#语法结构#第⼀种:取值变量for变量名in变量取值表do指令done#例⼦:#⽰例for a in {1..9}domkdir dir$adone#第⼆种:C语⾔型for循环for ((exp1; exp2; exp3))do指令done#例⼦:#⽰例for ((i=1;i<=3;i++))doecho $idone#解释:i从1开始,当i<=3就可以运⾏,如果运⾏的值⼤于3,就退出循环#语法结构讲解for关键字后的双括号是三个表达式,第⼀个是变量初始化(例如:i=1),第⼆个为变量的范围(例如i<=3),第三个为变量⾃增或⾃减(例如i++)。
当第⼀个表达式的初始化值符合第⼆个变量的范围时,就进⾏如循环执⾏,当条件不满⾜时就退出循环#简单⽰例#1.竖向打印10 9 8 7 6 5⼏个数字#第⼀种⽅法:直接列出元素[root@game scripts]# cat for1.sh#!/bin/bashfor i in12345doecho $idone#效果[root@game scripts]# sh for1.sh12345第⼆种⽅法:使⽤⼤括号{}⽣成数字序列[root@game scripts]# cat for2.sh#!/bin/bashfor i in {1..5}doecho $idone#效果[root@game scripts]# sh for2.sh12345#第三种⽅法:使⽤seq⽣成数字序列[root@game scripts]# cat for3.sh#!/bin/bashfor i in `seq 15`doecho $idone#效果[root@game scripts]# sh for3.sh12345#2.获取当前⽬录下的⽬录或⽂件名,并将其作为变量列表打印输出#数据[root@game ~]# mkdir -p /test/{test1.txt,test2.txt,guo.txt,ke.txt}[root@game ~]# ls -l /test/total 0drwxr-xr-x. 2 root root 6 Aug 2122:14 guo.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 ke.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 test1.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 test2.txt#编写脚本[root@game scripts]# cat for4.sh#!/bin/bashusage(){echo "directory not found"}[ ! -d /test ] && usage && exit 1cd /testfor i in `ls`doecho $idone#效果[root@game scripts]# sh for4.shguo.txtke.txttest1.txttest2.txt2、while循环#while循环⼀般应⽤于守护进程程序或⼀直循环执⾏#语法格式while <条件表达式>do指令done#简单⽰例每隔2秒在屏幕上输出⼀次负载值[root@game scripts]# cat while1.shwhile truedouptimesleep 2 #暂停2秒再执⾏done#提⽰:while true表⽰条件永远为真,因此会⼀直运⾏,像死循环⼀样,称为守护进程#效果:每隔2秒就输出⼀次[root@game scripts]# sh while1.sh23:11:35 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.0523:11:37 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.0523:11:39 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.053、until循环#until循环是当条件表达式不成⽴时,就会进⼊循环,当条件表达式成⽴时,就会终⽌循环#语法格式until <条件表达式>do指令done#⽰例#如果⽤户输出的是guoke就符合条件,退出循环,如果不是,⽤户输⼊3次之后就退出循环[root@game scripts]# cat until1.sh#!/bin/bashi=1until [ "$user" = "guoke" -o "$i" -gt 3 ]doread -p "please enter you username:" userlet i++done#效果[root@game scripts]# sh until1.shplease enter you username:guoke[root@game scripts]# sh until1.shplease enter you username:1please enter you username:1please enter you username:1[root@game scripts]#4、select循环#语法格式select变量名in [菜单取值列表]do指令done#⽰例#第⼀种:直接使⽤列表字符串[root@game scripts]# cat select1.sh#!/bin/bashselect name in apache httpd nginx tomcatdoecho $namedone#效果[root@game scripts]# sh select1.sh1) apache2) httpd3) nginx4) tomcat#? 1#? 3nginx#? 4tomcat#? ^C#第⼆种:采⽤数组做变量列表[root@game scripts]# cat select2.sh#!/bin/basharray=(apache nginx tomcat lighttpd)select name in"${array[@]}"doecho $namedone#效果[root@game scripts]# sh select2.sh1) apache2) nginx3) tomcat4) lighttpd#? 3tomcat#? 4lighttpd#? ^C5.循环控制及状态返回值break (循环控制)continue (循环控制)exit (退出脚本)return (退出函数)#区别break continue在条件语句及循环语句(for if while等)中⽤于控制程序的⾛向exit是终⽌所有语句并退出脚本return:仅⽤于在函数内部返回函数执⾏的状态值#break⽰例#如果i等于3,那么就终⽌循环[root@game scripts]# cat break1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thenbreakelseecho $ifidoneecho "1111"yum install net-tools -y > /dev/null[ $? -eq 0 ] && echo "already install"#效果[root@game scripts]# sh break1.sh121111already install#说明:i等于3的时候就终⽌循环,但是没有跳出脚本#exit⽰例[root@game scripts]# cat exit1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thenexit 1fiecho $idoneecho "ok"#执⾏效果[root@game scripts]# sh exit1.sh12#说明:当i等于3的时候就会退出脚本了,就不会执⾏后⾯的语句#continue⽰例[root@game scripts]# cat con1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thencontinueelseecho $ifidoneecho "ok"#执⾏效果[root@game scripts]# sh con1.sh。
linux shell 循环语句
linux shell 循环语句Linux Shell是一种强大的命令行工具,它提供了很多循环语句,可以帮助我们快速地处理大量的数据。
在本文中,我们将介绍一些常用的循环语句,包括for循环、while循环、until循环等,以及它们的用法和示例。
1. for循环for循环是一种常用的循环语句,它可以遍历一个列表或者一个范围内的数字。
for循环的语法如下:```for variable in listdocommand1command2...done```其中,variable是一个变量名,list是一个列表,可以是一个数组、一个文件列表或者一个字符串列表。
在循环中,变量variable会依次取list中的每个元素,并执行循环体中的命令。
例如,我们可以使用for循环来遍历一个数组:```#!/bin/bashfruits=("apple" "banana" "orange" "grape")for fruit in "${fruits[@]}"doecho "I like $fruit"done```输出结果为:```I like appleI like bananaI like orangeI like grape```2. while循环while循环是一种基于条件的循环语句,它会在条件为真的情况下一直执行循环体中的命令。
while循环的语法如下:```while conditiondocommand1command2...done```其中,condition是一个条件表达式,可以是一个比较运算符、一个逻辑运算符或者一个函数调用。
在循环中,只要条件为真,就会一直执行循环体中的命令。
例如,我们可以使用while循环来读取一个文件中的每一行:```#!/bin/bashwhile read linedoecho "$line"done < file.txt```其中,file.txt是一个文件名,read命令会读取文件中的每一行,并将其赋值给变量line。
shell break用法
shell break用法
在shell中,内建(builtin)命令break用于退出for、while、until、select循环,循环可嵌套多层。
具体用法如下:
1. break[n]:当n大于等于1时,命令用于退出指定的循环嵌套层数,n大于最大的循环嵌套层数时,则退出最大的循环嵌套层数。
不指定时,默认为1,即退出当前循环。
当n小于1时,命令出错,“loop count out of range”,退出状态为1。
2. break n:其中n指定了要跳出的循环层级。
默认情况下:n=1,表明跳出的是当前循环。
n=2,那么break命令就会停止下一级的外层循环。
以上信息仅供参考,建议查阅编程书籍或咨询专业人士获取更多帮助。
shell中的for循环用法详解
shell中的for循环⽤法详解for 命令:for i in 的各种⽤法:for i in “file1” “file2” “file3”for i in /boot/*for i in /etc/*.conffor i in $(seq -w 10) --》等宽的01-10for i in {1…10}for i in $( ls )for I in $(< file)for i in “$@” --》取所有位置参数,可简写为for i注意:bash shell⽀持C式for循环#!/bin/bashj=$1for ((i=1; i<=j; i++))dotouch file$i && echo file $i is okdone$@: 所有位置变量的内容$#: 位置变量的个数$0: ⽂件名$*: 所有位置变量的内容编写脚本应该注意的事项:1. 开头指定使⽤什么shell,例如:bash,ksh,csh等2. 脚本功能描述,使⽤⽅法,作者,版本,⽇期等3. 变量名,函数名要有实际意义,函数名以动名词形式,第⼆个单词⾸字母要⼤写。
例如:updateConfig()4. 缩进统⼀⽤4个空格,不⽤TAB5. 取变量值使⽤⼤括号,如${varname}6. 删除⽂件时,如果路径有变量的,要判断变量有值,如rm -f ${abc}/* 如果变量abc没有值,则会把根⽬录下的⽂件删除7. 脚本中尽量不要使⽤cd变换⽬录8. 函数中也要有功能描述,使⽤依法,版本,⽇期等9. 函数的功能要单⼀,不要太复杂10. $()⽐` `更好11. 尽量不要使⽤多层if语句,⽽应该以case语句替代12. 如果需要执⾏确定次数的循环,应该⽤for语句替代while语句13. 输⼊的参数要有正确性判断14. 多加注释,⽅便⾃⼰或他⼈阅读。
练习1:编写脚本清空所有arp缓存记录:#!/bin/bashfor i in $(arp | tail -n +2|tr -s ' ' |cut -d' ' -f1)doarp -d $idone练习2:产⽣⼗个随机数:⽅法1:for i in {0..9};do echo $RANDOM;done⽅法2:for i in $(seq 10);do echo $RANDOM;done练习3:倒数五秒:#!/bin/bashecho "准备倒数5秒:"for i in $(seq 5 -1 1)doecho -en "$i";sleep 1doneecho -e "开始"⽅法2:#!/bin/bashecho "准备倒数5秒:"for i in $(seq 5 -1 1)doecho -en "\b$i";sleep 1doneecho -e "\b开始"练习4:批量添加⽤户:#!/bin/bashfor i in $(cat /root/users.txt) --》从列表⽂件读取⽂件名douseradd $iecho "123456" | passwd --stdin $i --》通过管道指定密码字串done练习:查找出uid⼤于10000的⽤户,然后删除,必须使⽤for循环。
shell循环之for、while、case
shell循环之for、while、case一、for循环;二、while循环;三、case循环;一、for循环:概述:for循环根据指定的变量及变量取值列表,针对不同取值,重复执行命令,直到取值列表中的值全部用完,退出,for 循环适用于无规律的取值变量;语法:for 变量名 in 变量取值列表 ;do重复执行的命令(循环体),应用到变量名done变量取值列表:命令:cat、seq、awk等命令的屏幕输出结果,例:A=$(cat 1.txt)列表:直接在取值列表中定义内容1.{a..z}、{A..Z}、{1..10},直接在取值列表中定义内容;2.{a,b,c,d},直接在括号中写入内容;3.a b c d ,不用括号,直接用空格隔开每个值;数组:定义数组:数组名=(第0个数组值第1个数组值)查看属组:echo ${数组名[数组的第n个位置]} ##显示数组中的第n个值echo ${数组名[*]} ##显示数组中的所有值echo ${#数组名[*]} ##显示数组中的值的个数在脚本中使用数组:举例#!/bin/bashA=(vsftpd named sshd)for i in ${A[*]};do/etc/init.d/$i startdone二、while循环:概述:重复测试某个条件,只要条件成立,就重复执行命令,条件不成立,立即退出,自带判断;语法:while 条件测试操作 ;do重复执行的命令donewhile循环体内常用的命令:let i++等于i=$(expr $i+1) ##变量i每执行一次循环则加1;expr $RANDOM % 100 ##取得100以内的随机数;sleep 2 ##休眠2秒,避免死循环真用过多的硬件资源;退出while循环体的三种方式:条件为假退出循环体,继续执行循环体以外的命令;exit退出脚本,循环体外的命令不会执行;break退出脚本中的循环体,继续执行循环体外的命令;特殊条件表达式:true :当条件表达式为true时,那么代表条件表达式永远成立,为真;false:当条件表达式为false时,那么条件表达式永远为假;三、case循环:概述:根据变量的值,顺序匹配模式,匹配后执行命令并结束,如果没有匹配的模式,则执行默认命令,执行成功后退出,返回1,然后退出case;语法:case "变量" in模式1)命令1;;模式2)命令2;;*)默认命令exit 1;;esac模式:[0-9]:大括号内-表示一个连续的范围;A|B:|表示或;case循环案例一:交互式定义变量匹配case[root@ns bin]# cat key_hit_case.sh#!/bin/bashread -p "Please hit a key:" KEYcase $KEY in[a-z]|[A-Z])echo "your key is alph.";;[0-9])echo "your key is num.";;*)echo "your key may be is #!@ and so on." exit 1;;esac案例二:位置变量匹配case[root@ns bin]# cat prog_case.sh#!/bin/bash#chkconfig: - 98 10#description: A script for case by .case $1 instart)echo "hehe is starting."sleep 2;;stop)echo "hehe is stoping."sleep 2;;restart)$0 stop$0 start;;*)echo "Usage:$0 {start|stop|restart}"exit 1;;esac案例三:查看vsftpd服务的控制脚本[root@ns bin]# vim vsftpd#!/bin/bash#### BEGIN INIT INFO# Provides: vsftpd# Required-Start: $local_fs $network $named $remote_fs$syslog# Required-Stop: $local_fs $network $named $remote_fs $syslog# Short-Description: Very Secure Ftp Daemon# Description: vsftpd is a Very Secure FTP daemon. It was written completely from# scratch### END INIT INFO# vsftpd This shell script takes care of starting and stopping# standalone vsftpd.## chkconfig: - 60 50 ##设置允许级别和开、关机的启动顺序# description: Vsftpd is a ftp daemon, which is the program \# that answers incoming ftp service requests.# processname: vsftpd# config: /etc/vsftpd/vsftpd.conf# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/networkRETVAL=0prog="vsftpd"start() { ##编写start函数,函数将许多的操作集成# Start daemons.# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 1[ -x /usr/sbin/vsftpd ] || exit 1if [ -d /etc/vsftpd ] ; thenCONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`[ -z "$CONFS" ] && exit 6PROC_FAILED=0for i in $CONFS; dosite=`basename $i .conf`echo -n $"Starting $prog for $site: "daemon /usr/sbin/vsftpd $iRETVAL=$?echoif [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then touch /var/lock/subsys/$progelif [ $RETVAL -ne 0 ]; thenps -FC vsftpd | grep "$i" > /dev/nullRETVAL=$?if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then PROC_FAILED=1fifidoneif [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then RETVAL=1fielseRETVAL=1fireturn $RETVAL}stop() {# Stop daemons.echo -n $"Shutting down $prog: "killproc $progRETVAL=$?echo[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog return $RETVAL}# See how we were called.case "$1" instart)start;;stop)stop;;restart|reload)stopstartRETVAL=$?;;condrestart|try-restart|force-reload)if [ -f /var/lock/subsys/$prog ]; thenstopstartRETVAL=$?fi;;status)status $progRETVAL=$?;;*)echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"exit 1esacexit $RETVAL:wqfor循环案例一:交互式定义变量匹配case[root@ns bin]# cat key_hit_case.sh#!/bin/bashread -p "Please hit a key:" KEYcase $KEY in[a-z]|[A-Z])echo "your key is alph.";;[0-9])echo "your key is num.";;*)echo "your key may be is #!@ and so on."exit 1;;esac案例二:位置变量匹配case[root@ns bin]# cat prog_case.sh#!/bin/bash#chkconfig: - 98 10#description: A script for case by .case $1 instart)echo "hehe is starting."sleep 2;;stop)echo "hehe is stoping."sleep 2;;restart)$0 stop$0 start;;*)echo "Usage:$0 {start|stop|restart}"exit 1;;esac案例三:查看vsftpd服务的控制脚本[root@ns bin]# vim vsftpd#!/bin/bash#### BEGIN INIT INFO# Provides: vsftpd# Required-Start: $local_fs $network $named $remote_fs $syslog# Required-Stop: $local_fs $network $named $remote_fs $syslog# Short-Description: Very Secure Ftp Daemon# Description: vsftpd is a Very Secure FTP daemon. It was written completely from# scratch### END INIT INFO# vsftpd This shell script takes care of starting and stopping# standalone vsftpd.## chkconfig: - 60 50 ##设置允许级别和开、关机的启动顺序# description: Vsftpd is a ftp daemon, which is the program \# that answers incoming ftp service requests.# processname: vsftpd# config: /etc/vsftpd/vsftpd.conf# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/networkRETVAL=0prog="vsftpd"start() { ##编写start函数,函数将许多的操作集成# Start daemons.# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 1[ -x /usr/sbin/vsftpd ] || exit 1if [ -d /etc/vsftpd ] ; thenCONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`[ -z "$CONFS" ] && exit 6PROC_FAILED=0for i in $CONFS; dosite=`basename $i .conf`echo -n $"Starting $prog for $site: "daemon /usr/sbin/vsftpd $iRETVAL=$?echoif [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then touch /var/lock/subsys/$progelif [ $RETVAL -ne 0 ]; thenps -FC vsftpd | grep "$i" > /dev/nullRETVAL=$?if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then PROC_FAILED=1fifidoneif [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then RETVAL=1fielseRETVAL=1fireturn $RETVAL}stop() {# Stop daemons.echo -n $"Shutting down $prog: "killproc $progRETVAL=$?echo[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$progreturn $RETVAL}# See how we were called.case "$1" instart)start;;stop)stop;;restart|reload)stopstartRETVAL=$?;;condrestart|try-restart|force-reload)if [ -f /var/lock/subsys/$prog ]; thenstopstartRETVAL=$?fi;;status)status $progRETVAL=$?;;*)echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"exit 1esacexit $RETVAL:wqwhile、if脚本语句_价格竞猜vi 价格竞猜.sh ##编辑脚本文件#!/bin/bashp=$(expr $RANDOM % 1000) ##设置随机生成在0-999之间的数字的变量pt=0 ##设置竞猜的初始次数0的变量techo "商品价格在0-999之间,祝你好运~~~(退出请输入exit)" ##最初现在在屏幕上的内容while true ##设置条件一直为真,循环执行循环体do ##开始写循环体的内容read -p "输入价格:" n ##设置变量n,使用户手动输入变量内容let t++ ##使竞猜次数的变量t逐次加1if [[ $n = "exit" ]];then ##输入的内容是exit,则退出,双层[[]]的作用是避免脚本执行中出现line 9: [: ==: unary operator expected错误exit 0 && echo "退出成功!!谢谢惠顾!!"fiexpr $n + 1 &>/dev/null ##使用计算器计算用户竞猜的$n 加1的值,将结果输入到黑洞,意义在于当$n为字符时,加1会出现错误值if [ $? != 0 ];then ##if判断上条命令如果是错误的,返回值“”echo "请输入纯数字"elif [ -z $n ];then ##if判断若竞猜价格变量$n字符串为空的话,返回值echo "输入的数字不能为空"elif [ $n -eq $p ];then ##if判断$n等于实际价格$p的话,返回值“”,并且exit退出此脚本,显示一共猜测的次数echo "老铁,恭喜你,答对了。
Linuxshell实现用for循环100次的方法
C语言风格
for ((i=1; i<=100; i++)) do
echo $i done
Python风格(in的使用)
for i in {1..100} do
Байду номын сангаасecho $i done
Seq的使用
注意代码中不是单引号。
for i `seq 1 100` do
echo $i done
以上这篇Linux shell 实现用for循环100次的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多 支持。
这篇文章主要介绍编写一个awk脚本来找到一组单词中出现次数最多和最少的单词频率有需要的朋友可以借鉴参考下希望能够有所帮助祝大家多多进步早日升职加薪
Linuxshell实现用 for循环 100次的方法
前言
循环不管在程序中还是脚本中都需要经常用到,在写shell脚本时,经常需要for进行100次循环。这里谈谈几种从1到100的循 环方法。
shell中for几个常用写法
shell中for几个常用写法
在Shell脚本中,使用for循环是非常常见的。
下面是几种常用的for循环写法:
1. 遍历数字序列:
bash.
for i in {1..5}。
do.
echo "Number: $i"
done.
这个例子中,for循环会遍历从1到5的数字序列,并打印每个数字。
2. 遍历数组元素:
bash.
fruits=("apple" "banana" "orange")。
for fruit in "${fruits[@]}"
do.
echo "Fruit: $fruit"
done.
在这个例子中,for循环会遍历名为fruits的数组中的每个元素,并打印出每个元素的值。
3. 遍历目录中的文件:
bash.
for file in /path/to/directory/。
do.
echo "File: $file"
done.
这个例子中,for循环会遍历指定目录中的所有文件,并打印每个文件的路径。
无论是遍历数字序列、数组元素还是目录中的文件,for循环在Shell脚本中都是非常有用的工具,能够帮助我们轻松地处理各种不同类型的数据和任务。
for i in do done 一行写法
for i in do done 一行写法中括号内的内容"[for i in do done 一行写法]" 可以理解为使用Shell 脚本中的for 循环一行写法。
本文将从介绍Shell 脚本以及for 循环的基本知识开始,逐步解释使用一行写法的for 循环的用法和示例,以及相关的注意事项和实际应用案例。
Shell 脚本是一种运行在Unix 或类Unix 操作系统上的脚本语言,它通过命令行解释器(比如Bash)执行。
Shell 脚本主要用于批量处理任务、自动化操作以及系统管理。
其中,for 循环是Shell 脚本中常用的控制流语句,可以用来遍历一系列的值。
对于for 循环的基本语法,在使用多行写法时,通常是这样的:shellfor 变量in 值的列表do# 循环体done这里的"变量" 代表循环变量,"值的列表" 是需要遍历的值的集合,"循环体" 是要执行的任务。
每次循环中,变量会依次取值并执行循环体内的任务,直到遍历完所有的值。
而使用一行写法时,可以简化循环结构,将上述多行写法压缩为一行,如下所示:shellfor 变量in 值的列表; do 循环体; done下面我们将具体说明如何使用一行写法的for 循环,并给出一些示例。
1. 使用一行写法的for 循环,首先声明循环变量和值的列表,然后在分号后面编写循环体。
注意,循环体中的命令需要以分号或其他合适的符号进行分隔。
例如,我们可以使用一行写法遍历打印出1 到10 的数字:shellfor i in {1..10}; do echo i; done2. 一行写法的for 循环也可以使用命令替换来生成值的列表。
命令替换使用'`' 字符包围的命令,Shell 解释器会将其执行,并将结果作为循环值。
以下示例演示了通过命令替换获取当前目录下所有文件的文件名:shellfor file in (ls); do echo file; done3. 对于一行写法的for 循环,如果值的列表较长,可以使用Seq 命令来生成连续的数字序列。
shell 循环参数
在Shell脚本中,可以使用循环结构来遍历参数。
以下是一些常见的Shell循环参数的方法:
1.for 循环:可以使用for循环来遍历参数列表。
在循环体中,可以使用1、2等变量
来访问当前循环中的参数。
示例:
shell复制代码
#!/bin/bash
for arg in "$@"; do
echo $arg
done
上述脚本将依次输出传递给脚本的所有参数。
2. while 循环:可以使用while循环和shift命令来逐个处理参数。
shift命令会将位置参数向左移动,并返回移动后的第一个参数。
示例:
shell复制代码
#!/bin/bash
while [ $# -gt 0 ]; do
arg="$1"
echo $arg
shift
done
上述脚本将依次输出传递给脚本的所有参数。
3. until 循环:类似于while循环,可以使用until循环和shift命令来处理参数。
示例:shell复制代码
#!/bin/bash
until [ $# -eq 0 ]; do
arg="$1"
echo $arg
shift
done
上述脚本将依次输出传递给脚本的所有参数。
这些方法可以根据具体需求选择使用,根据参数的数量和顺序,可以在循环体中进行相应的处理操作。
python shell中for循环用法
在Python Shell中,你可以使用for循环来遍历可迭代对象(如列表、元组、字符串等)中的元素。
以下是几种常用的for循环用法示例:1. 遍历列表:```pythonfruits = ["Apple", "Banana", "Orange"]for fruit in fruits:print(fruit)```在上面的示例中,我们使用for循环遍历了一个名为fruits的列表,并打印出每个水果。
2. 遍历元组:```pythonperson = ("John", 25, "New York")for item in person:print(item)```在上面的示例中,我们使用for循环遍历了一个名为person的元组,并打印出其中的每个元素。
3. 遍历字符串:```pythonmessage = "Hello, World!"for char in message:print(char)```在上面的示例中,我们使用for循环遍历了一个名为message的字符串,并打印出其中的每个字符。
4. 遍历范围(range):```pythonfor i in range(5):print(i)```在上面的示例中,我们使用for循环遍历了一个范围对象(使用range函数生成),并打印出其中的每个值。
需要注意的是,在Python Shell中使用for循环时,需要缩进循环体内的代码。
Python 使用缩进来表示代码块的层次结构。
这只是一些for循环用法的示例,Python还提供了其他更高级的用法,如循环控制语句(break和continue)、嵌套循环等。
如果你有特定的问题或需求,请提供更多详细信息,我将尽力提供更准确的答案。
linux中for用法
linux中for用法在Linux中,`for`是一个用于循环迭代的关键字,常用于Shell 脚本编程。
它允许您在一个代码块中重复执行一系列操作,对列表、文件内容等进行迭代处理。
以下是`for`循环在Linux中的几种常见用法:1. 遍历列表元素:for item in item1 item2 item3do# 在这里执行操作,针对每个元素echo $itemdone在这个示例中,`for`循环会依次将`item1`、`item2`和`item3`赋值给变量`item`,然后执行相应的操作。
2. 遍历数组元素:my_array=("apple" "banana" "orange")for item in "${my_array[@]}"do# 在这里执行操作,针对每个元素echo $itemdone在这个示例中,`for`循环通过`${my_array[@]}`获取数组`my_array`的所有元素,并将它们依次赋值给变量`item`。
3. 遍历文件内容:for line in $(cat myfile.txt)do# 在这里执行操作,针对每一行内容echo $linedone在这个示例中,`for`循环通过`$(cat myfile.txt)`将`myfile.txt`文件的内容逐行读取,并将每行内容赋值给变量`line`。
4. 使用通配符遍历文件:for file in /path/to/files/*do# 在这里执行操作,针对每个文件echo $filedone在这个示例中,`for`循环使用通配符`*`匹配指定目录下的所有文件,并将每个文件路径赋值给变量`file`。
这只是`for`循环在Linux中的一些常见用法示例。
您可以根据具体需求和场景进行适当的调整和扩展。
请注意,在编写Shell脚本时,应注意语法和变量的引用方式,以及可能的文件路径安全性和异常处理等问题。
forin用法
forin用法for...in用法简介在编程中,我们经常会使用循环语句来重复执行某一段代码。
其中一种常见的循环语句是for循环,它可以让我们在指定的范围内重复执行代码块。
for...in是for循环的一种特殊形式,它用于遍历对象的属性。
for...in循环的语法如下:for (variable in object) {// code to be executed}其中,variable是一个变量名,用于在循环中存储每个属性的名称。
而object则是要遍历的对象。
在每次循环迭代中,variable会自动指向对象的一个属性。
下面我们来更详细地了解一下for...in的用法。
1. 遍历对象属性使用for...in循环可以便利对象的所有属性。
在循环中,每次迭代时,变量会自动指向对象的一个属性。
```javascriptlet person = {name: "John",age: 30,gender: "male"};for (let key in person) {console.log(key + ": " + person[key]);}```上述代码会输出:```name: Johnage: 30gender: male```可以看到,for...in循环遍历了person对象的所有属性,并输出了属性名称和属性值。
2. 遍历数组索引除了遍历对象的属性,for...in循环也可以用于遍历数组的索引。
```javascriptlet fruits = ["apple", "banana", "orange"];console.log(index + ": " + fruits[index]);}```运行上述代码会输出:```0: apple1: banana2: orange```可以看到,for...in循环遍历了fruits数组的索引,并输出了索引和对应的元素。
shell语法中的for循环用法ING
shell语法中的for循环用法ING关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿…1、 for((i=1;i<=10;i++));do echo $(expr $i \* 4);done2、在shell中常用的是 for i in $(seq 10)3、for i in `ls`4、for i in ${arr[@]}5、for i in $* ; do6、for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do7、for i in f1 f2 f3 ;do8、for i in *.txt9、for i in $(ls *.txt)for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串数组============ -_- ==============for num in $(seq 1 100)10、LIST=”rootfs usr data data2″for d in $LIST; do用for in语句自动对字符串按空格遍历的特性,对多个目录遍历11、for i in {1..10}12、for i in stringchar {1..10}13、awk ‘BEGIN{for(i=1; i<=10; i++) print i}’注意:AWK中的for循环写法和C语言一样的===============================================================01.#/bin/bash02.# author: 周海汉03.# date :2010.3.2504.# /ablo_zhou05.arr=(“a”“b”“c”)06.echo “arr is (${arr[@]})”07.echo “item in array:”08.for i in ${arr[@]}09.do10. echo “$i”11.done12.echo “参数,\$*表示脚本输入的所有参数:”13.for i in $* ; do14.echo $i15.done16.echo17.echo ‘处理文件/proc/sys/net/ipv4/conf/*/accept_redirects:’18.for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do19.echo $File20.done21.echo “直接指定循环内容”22.for i in f1 f2 f3 ;do23.echo $i24.done25.echo26.echo “C 语法for 循环:”27.for (( i=0; i<10; i++)); do28.echo $i29.done———————————————————————————–———————-shell中for循环用法shell语法好麻烦的,一个循环都弄了一会,找了几个不同的方法来实现输出1-100间可以被3整除的数1.用(())#!/bin/bashclearfor((i=1;i<100;i++))fordoif((i%3==0))thenecho $icontinuefidone2.使用`seq 100`#!/bin/bashclearfor i in `seq 100`doif((i%3==0))thenecho $icontinuefidone3.使用while#!/bin/bashi=1while(($i<100))doif(($i%3==0))thenecho $ifii=$(($i+1))done———————————————————————————–———————在shell用for循环做数字递增的时候发现问题,特列出shell下for循环的几种方法:1.for i in `seq 1 1000000`;doecho $idone用seq 1 10000000做递增,之前用这种方法的时候没遇到问题,因为之前的i根本就没用到百万(1000000),因为项目需要我这个数字远大于百万,发现用seq 数值到 1000000时转换为1e+06,根本无法作为数字进行其他运算,或者将$i有效、正确的取用,遂求其他方法解决,如下2.for((i=1;i<10000000;i++));doecho $idone3.while(($i<10000000));doecho $ii=`expr $i + 1`done因为本方法调用expr故运行速度会比第1,第2种慢不少不过可稍作改进,将i=`expr $i + 1`改为i=$(($i+1))即可稍作速度的提升,不过具体得看相应shell环境是否支持4.for i in {1..10000000;doecho $idone其实选用哪种方法具体还是得由相应的shell环境的支持,达到预期的效果,再考虑速度方面的问题。
Shell的for循环小例子
Shell的for循环⼩例⼦<1>上例⼦for i in f1 f2 f3; do@echo $i;done执⾏结果:f1f2f3但是,请注意:如果是在makefile 中写,要写成这个样⼦:all:for i in f1 f2 f3; do\@echo $$i; \done如果 @echo $$i; 后⾯没有反斜线,则会出现:/bin/sh: -c:⾏3: 语法错误: 未预期的⽂件结尾这是因为如果是如下:all: for i in f1 f2 f3; do\ @echo $$i; done会被认为没有 done, 要么要在 @echo $$i;后加反斜线表⽰shell代码尚未结束, 要么就写成如下的⼀⾏: all: for i in f1 f2 f3; do\ @echo $$i; done或者⼲脆:all: for i in f1 f2 f3; do @echo $$i; done<2>all : @echo no\space @echo no\ space @echo one \space @echo one\ space⽣成如下的四个输出:nospacenospaceone spaceone space这⾥我插⼊下:第⼀个是 no 直接跟反斜线,下⼀⾏⽆空格,也⽆tab符号,直接space,输出 nospace第⼆个是 no 直接跟反斜线,下⼀⾏,有tab符号,然后跟space,输出 nospace第三个是 one 后有⼀个空格,然后是跟反斜线,下⼀⾏,有tab符号,然后跟space,输出 one space 第四个是 one 后跟反斜线,下⼀⾏,有tab符号,然后跟⼀个空格,然后跟space,输出 one spaceall : ; @echo 'hello \world' ; echo "hello \world"会激活⼀个shell,执⾏下列指令:echo 'hello \world' ; echo "hello \world"根据shell对反斜线的解释,会形成下列输出:hello \worldhello world。
Linuxshell之三种For循环结构之列表for循环
Linuxshell之三种For循环结构之列表for循环Linux shell之三种For 循环结构1. 列表for 循环for variable in {list}docommandcommanddonecat for_exam1.sh#!/bin/bashfor varible1 in 1 2 3 4 5doecho "hello ,welcome $varible1 times"done执⾏:./for_exam1.shhello ,welcome 1 timeshello ,welcome 2 timeshello ,welcome 3 timeshello ,welcome 4 timeshello ,welcome 5 times注:for 循环⽀持缩略计数for varible1 in {1..5} #只能⽤两个点做为省略号doecho "hello ,welcome $varible1 times"done#for循环⽀持按规定的步数跳跃cat for_exam3.sh#!/bin/bash#对sum赋初值sum=0#使⽤列表for循环计算1~100内所有的奇数之和,并将值保存在sum中for i in {1..100..2}dolet "sum+=i"done#输出sum值echo "sum=$sum"#for循环⽤seq命令⽀持按步数递增#!/bin/bash#对sum赋初值sum=0#使⽤列表for循环计算1~100内所有的奇数之和,并将值保存在sum中for i in $(seq 1 2 100)dolet "sum+=i"done#输出sum值echo "sum=$sum"#当前⽬录下所有⽂件的显⽰#!/bin/bash#ls显⽰当前⽬录下所有⽂件的显⽰for file in $( ls ) doecho "file:$file" done。
shell中循环用法
shell中循环用法在Shell脚本中,可以使用以下几种循环用法:1. for循环:```shellfor 变量 in 列表do循环体done```示例:```shellfor i in {1..5}doecho "循环次数: $i"done```2. while循环:```shellwhile [ 条件 ]do循环体done```示例:```shelli=1while [ $i -le 5 ]doecho "循环次数: $i"i=$((i+1))done```3. until循环:```shelluntil [ 条件 ]do循环体done```示例:```shelli=1until [ $i -gt 5 ]doecho "循环次数: $i"i=$((i+1))done```4. select循环(用于菜单选择): ```shellselect 变量 in 列表do循环体done```示例:```shellselect fruit in Apple Banana Orange Exit docase $fruit inApple)echo "You selected Apple.";;Banana)echo "You selected Banana.";;Orange)echo "You selected Orange.";;Exit)break;;*)echo "Invalid selection.";;esacdone```这些循环用法可以根据具体需求选择使用,可以根据条件或固定次数来控制循环执行,并在循环体内执行相应的操作。
Shell入门-for循环和select循环
Shell⼊门-for循环和select循环for循环和select循环本篇主要介绍内容:for循环的定义及使⽤select循环的⽤途for循环第⼀种for循环语句为变量取值型,语法结构如下:for 变量名 in 变量取值列表do指令...done提⽰:在此结构中“in变量取值列表”可以省略,省略时相当于in“$@”,也就是使⽤for i就相当于使⽤for i in“$@”。
在这种for循环语句语法中,for后⾯的变量名取⾃变量列表中的元素,每次取⼀个,并且变量取值列表以空格区分。
第⼆种for循环语句称为for循环语句,语法结构如下:for((exp1;exp2;exp3))do指令..donefor关键字后的双括号内是三个表达式,第⼀个是变量初始化(例如:i=0),第⼆个为变量的范围(例如:i<100),第三个为变量⾃增或⾃减(例如:i++)。
当第⼀个表达式的初始化值符合第⼆个变量的范围时,就进⼊循环执⾏;当条件不满⾜时就退出循环。
总结:1)如果希望程序持续运⾏,则多⽤while,包括守护进程。
2)如果是有限次循环,则多⽤for,实际⼯作中使⽤for的机会更多。
实践-竖向打印数字竖向打印5、4、3、2、1五个数字[root@localhost shell]# cat 11_2_1.sh#!/bin/bash#***********************************************#Author: luotianhao#Mail: tianhao.luo@#Version: 1.0#Date: 2021-03-15#FileName: 11_2_1.sh#Description: This is a test script.#***********************************************for num in 5 4 3 2 1doecho $numdone[root@localhost shell]# sh 11_2_1.sh54321第⼆种,使⽤了{}⽣成数字序列的⽅法[root@localhost shell]# cat 11_2_2.sh#!/bin/bash#***********************************************#Author: luotianhao#Mail: tianhao.luo@#Version: 1.0#Date: 2021-03-15#FileName: 11_2_2.sh#Description: This is a test script.#***********************************************for n in {5..1}doecho $ndone[root@localhost shell]# sh 11_2_2.sh54321第三种,采⽤seq⽣成数字序列的⽤法[root@localhost shell]# cat 11_2_3.sh#!/bin/bash#***********************************************#Author: luotianhao#Mail: tianhao.luo@#Version: 1.0#Date: 2021-03-15#FileName: 11_2_3.sh#Description: This is a test script.#***********************************************for n in $(seq 5 -1 1)doecho $ndone[root@localhost shell]# sh 11_2_3.sh54321实践-批量修改⽂件后缀将下⾯的txt⽂件改为log⽂件[root@localhost shell]# ls -l stu*-rw-r--r-- 1 root root 2 3⽉ 7 15:59 stu_102999_1.txt-rw-r--r-- 1 root root 2 3⽉ 7 15:59 stu_102999_2.txt-rw-r--r-- 1 root root 2 3⽉ 7 15:59 stu_102999_3.txt-rw-r--r-- 1 root root 2 3⽉ 7 15:59 stu_102999_4.txt提⽰:通过此题的解答可以学习到sed、awk、rename、mv等命令的实战应⽤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for in 格式
for 无$变量 in 字符串
do
$变量
done
一简单的字符串枚举遍历法,利用for in格式对字符串按空格切份的功能SERVICES="80 22 25 110 8000 23 20 21 3306 "
for x in $SERVICES
do
iptables -A INPUT -p tcp --dport $x -m state --st ate NEW -j ACCEPT
done
for variable in values --------字符串数组依次赋值
#!/bin/sh
for i in a b c 字符串列表A B C
字符串用空格分隔,没有括号,没有逗号, 然后循环将
其依次赋给变量i
变量没有$
do
echo "i is $i"
done
[macg@machome ~]$ sh test.sh
i is a
i is b
i is c
for in 里,变量和*不等价
#!/bin/bash
for i in *.h ;
do
cat ${i}.h
done
[macg@vm test]$ ./tip.sh
cat: *.h.h: No such file or directory
$i代表的是整个路径,而不是*.h里的.h前面的部分改正
#!/bin/bash
for i in *.h
do
cat $i
done
[macg@vm test]$ echo hahaha >>1.h
[macg@vm test]$ echo ha >>2.h
[macg@vm test]$ ./tip.sh
hahaha
ha
例2:
for i in
/etc/profile.d/*.sh do
$i
done $i代表的是
/etc/profile.d/color.sh, /etc/profile.d/alias.sh, /etc/profile.d/default.sh
for in 对(命令行,函数)参数遍历
test()
{
local i
for i in $* ; do
echo "i is $i"
done
}
$*是字符串:以"参数1 参数2 ... " 形式保存所有参数$i是变量i的应用表示
[macg@machome ~]$ sh test.sh p1 p2 p3 p4
i is p1
i is p2
i is p3
i is p4
for in语句与通配符*合用,批量处理文件
批量改文件名
[root@vm testtip]# ls
aaa.txt ccc.txt eee.txt ggg.txt hhh.txt jjj.txt lll.txt nnn.tx t
bbb.txt ddd.txt fff.txt go.sh iii.txt kkk.txt mmm.txt ooo.tx t
[root@vm testtip]# cat go.sh
for i in *.txt *.txt相当于一个字符串数组,依次循环赋值给i
do
mv "$i" "$i.bak"
done
[root@vm testtip]# sh go.sh
[root@vm testtip]# ls
aaa.txt.bak ccc.txt.bak eee.txt.bak ggg.txt.bak hhh.txt.bak jjj. txt.bak lll.txt.bak nnn.txt.bak
bbb.txt.bak ddd.txt.bak fff.txt.bak go.sh iii.txt.bak kkk. txt.bak mmm.txt.bak ooo.txt.bak
for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串数组
for i in $(ls *.txt)
do
echo $i
done
[macg@machome ~]$ sh test
111-tmp.txt
111.txt
22.txt
33.txt
或者说,利用for in克服` `和$( ) 的多行合为一行的缺陷
利用for in 自动对字符串按空格遍历的特性,对多个目录遍历
LIST="rootfs usr data data2"
for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/ umount /backup/$d
done。