Shell 循环基础
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脚本之循环使用forwhile详解
shell脚本之循环使⽤forwhile详解任何⼀种编程语⾔中循环是⽐不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句、 while 语句。
⽂中主要以实际⽤例来说明 for while 都有哪些常见的使⽤⽅法和技巧。
⼀、for 循环使⽤1. seq 命令⽅式for i in $(seq10);doecho"$i"done2. C语⾔语法⽅式for ((i=0; i<9; i++));doecho"$i"done3. 循环遍历⽂件列表for file in $(ls /root/); doecho"$file"done4. 循环遍历数组元素for i in ${arr[@]}; doecho"$i"done5. 循环遍历脚本参数列表for arg in $*; doecho"$arg"done6. 显式指定列表for i in123 ;doecho $idone7. 列表 for 循环for i in {1..5}; doecho"$i"done8. 步数跳跃⽅式进⾏循环for i in {1..20..2};doecho"$i"done⼆、while 循环使⽤1. 普通 while 语法while(( i<=100 ));do... ...donewhile [[ "$num" != 4 ]]; do... ...donewhile [ "$num" -gt 0 ]; do......done待更新。
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编程总结
shell编程总结
Shell编程是一种基于命令行的脚本编程语言,常用于Linux和Unix系统中。
本文将对Shell编程进行总结,包括以下内容:
1. Shell的基础知识:介绍Shell的定义、历史、发展以及Shell 与Linux的关系。
2. Shell脚本的格式:讲解Shell脚本的格式,包括文件头、变量、注释、命令等。
3. Shell命令:介绍常用的Shell命令,如ls、cd、cp、mv、rm、mkdir、cat等。
4. Shell的流程控制:讲解Shell脚本的流程控制语句,包括if语句、for循环、while循环、case语句等。
5. Shell函数:介绍Shell函数的定义、调用和传参等。
6. Shell的文本处理:讲解Shell脚本中的文本处理命令,如grep、sed、awk等。
7. Shell的正则表达式:介绍正则表达式的定义、语法和常用操作符等。
8. Shell的调试和错误处理:讲解Shell脚本的调试方法和错误处理语句,如set -x、set -e等。
9. Shell脚本的实战:通过实际案例介绍如何使用Shell脚本进行系统管理、日志分析、数据处理等。
通过本文的总结,读者可全面了解Shell编程的基础知识和常用技巧,提高Shell编程的能力。
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 循环语句
shell 循环语句Shell循环语句是Shell脚本中最常用的语句之一,其可以帮助我们在脚本中重复执行某些命令,从而达到自动化的效果。
以下是10个常见的Shell循环语句:1. for循环for循环是Shell中最常见的循环语句之一,其可以用来遍历一个列表或者执行一些固定次数的操作。
其语法如下:```bashfor variable in listdocommand1command2...commandNdone```其中,`variable`是一个变量,`list`是一个用空格分隔的列表,`command1`、`command2`、...、`commandN`是需要执行的命令。
2. while循环while循环是Shell中另一个常见的循环语句,其可以用来重复执行一些命令,直到某个条件不再成立为止。
其语法如下:```bashwhile [ condition ]docommand1command2...commandNdone```其中,`condition`是一个用于控制循环是否执行的条件,`command1`、`command2`、...、`commandN`是需要执行的命令。
3. until循环until循环和while循环类似,不同的是它会一直执行直到某个条件成立为止。
其语法如下:```bashuntil [ condition ]docommand1command2...commandNdone```其中,`condition`是一个用于控制循环是否执行的条件,`command1`、`command2`、...、`commandN`是需要执行的命令。
4. case语句case语句可以用来根据不同的条件执行不同的命令。
其语法如下:```bashcase expression inpattern1)command1;;pattern2)command2;;*)commandN;;esac```其中,`expression`是一个表达式,`pattern1`、`pattern2`、...、`patternN`是不同的模式,`command1`、`command2`、...、`commandN`是需要执行的命令。
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)、嵌套循环等。
如果你有特定的问题或需求,请提供更多详细信息,我将尽力提供更准确的答案。
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脚本中的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。
如何在Shell脚本中实现循环
如何在Shell脚本中实现循环Shell脚本是一种在Unix或Linux系统中批量执行命令的脚本语言。
循环是Shell脚本中非常常用的一种控制结构,可以帮助我们重复执行一段代码块。
本文将介绍如何在Shell脚本中实现循环,包括for循环、while循环和until循环。
一、for循环for循环是一种在Shell脚本中用于遍历列表或序列的循环结构。
以下是for循环的基本语法:```shellfor 变量 in 列表do命令done```其中,变量表示用于遍历列表的变量名,列表是一组用空格分隔的值或通配符。
循环会依次将列表中的值赋给变量,并执行循环体中的命令。
示例:计算1到10的和。
```shellfor i in 1 2 3 4 5 6 7 8 9 10dosum=$((sum + i))doneecho "1到10的和为:$sum"```二、while循环while循环是一种在Shell脚本中用于根据条件来循环执行一段代码块的结构。
以下是while循环的基本语法:```shellwhile 条件do命令done```其中,条件是一个用于判断循环是否继续执行的表达式。
只有当条件为真时,循环体中的命令才会执行。
示例:计算1到10的和。
sum=0i=1while [ $i -le 10 ]dosum=$((sum + i))i=$((i + 1))doneecho "1到10的和为:$sum"```三、until循环until循环与while循环类似,不同之处在于条件是一个判断为假时执行循环体的表达式。
以下是until循环的基本语法:```shelluntil 条件do命令done```其中,条件是一个用于判断循环是否继续执行的表达式。
只有当条件为假时,循环体中的命令才会执行。
示例:计算1到10的和。
```shellsum=0i=1until [ $i -gt 10 ]dosum=$((sum + i))i=$((i + 1))doneecho "1到10的和为:$sum"```通过以上示例,我们可以看到如何在Shell脚本中实现循环。
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的循环语句
shell的循环语句Shell是一种脚本语言,通过编写Shell脚本可以实现自动化任务和循环操作。
循环语句是Shell脚本中非常重要的部分,可以根据特定条件执行重复的操作。
下面我将列举10个常用的Shell循环语句并详细介绍其用法。
1. for循环for循环是Shell脚本中最常用的循环语句之一,它可以按照一定的条件循环执行特定的命令或操作。
其基本语法如下:```for 变量 in 列表do命令或操作done```其中,变量是循环变量,列表是需要循环遍历的对象,循环体内的命令或操作将会被执行多次。
2. while循环while循环是另一种常用的循环语句,它会在满足特定条件的情况下重复执行命令或操作。
其基本语法如下:```while 条件do命令或操作done```条件是一个判断表达式,只有当条件为真时,循环体内的命令或操作才会被执行。
3. until循环until循环与while循环相似,但是它会在条件为假时执行循环体内的命令或操作。
其基本语法如下:```until 条件do命令或操作done```条件也是一个判断表达式,只有当条件为假时,循环体内的命令或操作才会被执行。
4. case语句case语句是一种多分支选择结构,可以根据不同的条件执行不同的命令或操作。
其基本语法如下:```case 变量 in模式1)命令或操作1;;模式2)命令或操作2;;*)命令或操作3;;esac```根据变量的值,case语句会逐个匹配模式,当匹配到某个模式时,会执行对应的命令或操作。
5. select语句select语句可以用来创建菜单选择界面,用户可以通过数字选择不同的选项。
其基本语法如下:```select 变量 in 选项1 选项2 ...do命令或操作done```用户可以通过输入数字来选择不同的选项,循环体内的命令或操作将会根据用户的选择执行。
6. break语句break语句可以用来跳出当前循环,终止循环的执行。
shell的while死循环写法
shell的while死循环写法Shell编程是一种非常强大的脚本语言,其中的循环结构在程序开发中起到了至关重要的作用。
本文将详细介绍如何使用Shell语言中的while循环来创建一个死循环,并讲解每个步骤的具体实现方法。
一、Shell编程简介Shell编程是一种运行在Unix和类Unix系统上的脚本语言,它提供了命令行界面与底层操作系统进行交互。
Shell脚本可以通过一个或多个命令组成,用于处理文本和执行系统操作等任务。
二、Shell中的while循环while循环是Shell编程中最常用的循环结构之一。
它的作用是根据给定条件循环执行一段代码块,直到条件不再满足为止。
在这里,我们将使用while循环来创建一个死循环。
三、创建一个死循环要创建一个死循环,我们需要定义一个永远为真的条件。
在Shell编程中,通常可以使用true命令作为条件来实现这一点。
下面是一个简单的死循环示例:shellwhile truedoecho "This is an infinite loop"done在上面的示例中,`while true`定义了一个永远为真的条件。
而`do`和`done`之间的代码块将会被无限循环执行。
每次循环执行时,会打印一行文本:"This is an infinite loop"。
四、让死循环可退出如果我们希望能够通过某种方式退出死循环,可以在循环体内加入一个退出条件。
下面是一个示例,展示如何使用`break`关键字来退出循环:shellwhile truedoecho "This is an infinite loop"read -p "Do you want to exit? (y/n)" choiceif [ "choice" = "y" ]; thenbreakfidone在上面的示例中,我们在循环体内添加了一行代码`read -p "Do you want to exit? (y/n)" choice`,它会提示用户输入一个选择("y"或"n")。
快速入门Shell脚本之条件判断语句与循环
快速⼊门Shell脚本之条件判断语句与循环⽬录1.条件判断1.1基本语法1.2.常⽤的判断条件1.3.案例实例1.4.if判断1.5 case语句2.循环2.1for循环⽐较 $ * 和$ @区别3.2 whlie循环相信⼤家已经对shell脚本有⼀定的了解了,⼤家对于shell脚本的条件判断语句⼀定⾮常期待。
本篇博客,我们来聊⼀聊关于shell的条件判断语句与循环。
1.条件判断1.1基本语法[condition]注意:condition前后要有空格条件⾮空既为true,[atguigu]发回true,[]返回false1.2.常⽤的判断条件(1)两个整数之间⽐较 = 字符串⽐较-lt ⼩于(less than) -le ⼩于等于(less equal)-eq 等于(equal) -gt ⼤于(greater than)-ge ⼤于等于(greater equal) -ne 不等于(Not equal)(2)按照⽂件权限进⾏判断-r 有读的权限(read)-w 有写的权限(write)-x 有执⾏的权限(execute)(3)按照⽂件类型进⾏判断-f ⽂件存在并且是⼀个常规的⽂件(file)-e ⽂件存在(existence)-d ⽂件存在并是⼀个⽬录(directory)1.3.案例实例23是否⼤于等于22 使⽤$?查看结果为true返回0[root@node01 shell]# [ 23 -ge 22 ][root@node01 shell]# echo $?查看⽂件具体的权限使⽤$?查看结果为true返回0[root@node01 shell]# [ -w helloword.sh ][root@node01 shell]# echo $?查看某个⽬录下的⽂件是否存在使⽤$?查看结果为true返回0[root@node01 shell]# [ -e /opt/shell/aa.txt ] --不存在[root@node01 shell]# echo $?1[root@node01 shell]# [ -e /opt/shell/helloword.sh ][root@node01 shell]# echo $?多条件判断(&&表⽰前⼀条命令执⾏成功是,才执⾏后⼀条命令,||表⽰上⼀个命令执⾏失败后,才执⾏下⼀条命令)[root@node01 shell]# [ condition ] && echo ok || echo notOKok[root@node01 shell]# [ condition ] && [ ] ||echo notOknotOk1.4.if判断1.4.1 基本语法if [条件判断式];then程序fi或者if [ 条件判断式 ]then程序fi #结束符注意:[条件判断式],中括号和条件判断式之间必须有空格if后⾯要有空格1.4.2 案例实操输⼊⼀个数字,如果是1,则输出我是张三,如果为2,则输出我是李四,如果为其什么不输出。
cshell循环语句
cshell循环语句CShell循环语句CShell是一个强大的Unix Shell,它提供了丰富的命令和功能来帮助用户在Unix/Linux系统中进行操作和管理。
其中一个重要的功能是循环语句,它允许用户重复执行一组命令,从而简化和自动化任务。
在本文中,我们将深入探讨CShell循环语句的使用和技巧。
一、什么是循环语句?循环语句是一种编程结构,允许程序重复执行一组命令,直到达到指定的条件。
在CShell中,有两种主要类型的循环语句:while和for。
while循环会在条件为真时重复执行一组命令,而for循环会在给定的范围内重复执行一组命令。
二、使用while循环1. 基本语法下面是while循环的基本语法:while (condition)commandend其中,condition是一个逻辑表达式,如果结果为真,则执行command。
如果condition的结果为假,则退出循环。
2. 示例假设我们要打印从1到10的数字,可以使用while循环来实现:set i = 1while (i <= 10)echo iset i = `expr i + 1`end在上面的示例中,我们首先将变量i设置为1,然后在while循环中,我们打印i的值并将i增加1。
该过程会重复执行,直到i的值大于10为止。
这将导致将数字从1到10打印在屏幕上。
三、使用for循环1. 基本语法下面是for循环的基本语法:for (init; condition; step)commandend其中,init是初始化表达式,condition是循环条件,step是循环步进表达式。
for循环会先执行一次init,然后在每次循环迭代中检查condition,如果为真,则执行command并执行step。
2. 示例假设我们要打印从1到10的数字,可以使用for循环来实现:for (set i = 1; i <= 10; set i = `expr i + 1`)echo iend在上面的示例中,我们首先将i初始化为1,然后在每次循环中,我们打印i的值并将i增加1。
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 "老铁,恭喜你,答对了。
shell中while和print的用法 -回复
shell中while和print的用法-回复Shell中的while和print用法Shell是一种脚本语言,广泛用于Linux和Unix系统中。
它提供了一系列的命令和功能,可以对文件和数据进行处理和操作。
在Shell中,while和print是两个常用的关键字。
while用于循环执行一段代码,而print用于打印输出信息。
在本文中,我们将逐步讲解这两个关键字的用法和示例。
一、while循环的使用while循环用于执行一段代码块,只要指定的条件为真。
它的基本语法如下:while [条件]do代码块done其中,条件可以是一个命令,也可以是一个表达式。
当条件为真时,执行代码块中的语句,然后再次检查条件。
如果条件仍为真,继续执行代码块。
循环会一直进行,直到条件为假。
1.1使用命令作为条件我们首先来看一个简单的例子,使用命令作为条件。
假设我们要循环打印当前系统时间,并在循环执行一定次数后退出。
代码如下:count=0while [ count -lt 5 ]doecho "当前系统时间:(date)"count=((count+1))done在这个例子中,我们使用了一个变量count来记录循环次数。
while循环的条件是count小于5,即循环执行不超过5次。
每次循环开始时,使用`echo`命令打印出当前的系统时间,并使用`(date)`来获取系统时间的输出。
然后,我们将count的值增加1,以便循环计数。
循环执行5次后,条件不再满足,循环结束。
1.2使用表达式作为条件除了使用命令作为条件外,还可以使用表达式。
表达式通常使用关系运算符(比如`-gt`、`-lt`)和逻辑运算符(比如`&&`、` `)来进行条件判断。
假设我们有一个文本文件`data.txt`,它包含了一些数字(一行一个数字)。
我们要统计该文件中大于10的数字的数量。
代码如下:count=0while read numdoif [ num -gt 10 ]thencount=((count+1))fidone < data.txtecho "大于10的数字数量为:count"在这个例子中,我们使用`read`命令读取文件`data.txt`中的每一行数字,并将其存储到变量`num`中。
shell if continue的用法
shell if continue的用法Shell中的“if continue”结构是一个用于控制流程的条件语句,常常用于循环中。
当条件被满足时,这个结构会执行continue语句,跳过当次循环中剩余的语句,转而执行下一轮循环。
```shellwhile condition; doif test <condition>; thencontinuefi# statementsdone```在这个过程中,如果条件不成立,跳过if语句,执行剩余的语句,最终结束本次循环。
例子1:```shell#!/bin/bash在这个例子中,使用for循环从1到10迭代每个数字,使用if语句判断i是否为偶数,如果是偶数,跳过后面的语句,如果是奇数,输出该数字。
# 打印数组中的奇数numbers=(1 2 3 4 5 6 7 8 9 10)for i in "${numbers[@]}"; do# 如果 i 是偶数,跳过这个循环if (( i % 2 == 0 )); thencontinuefiecho $idone```在Shell脚本中,if continue的另一个实用场景是在编写复杂的逻辑操作中调试代码。
在开发过程中,使用if continue可以改变循环的行为,以便排除错误的可能性。
总结if continue是Shell脚本中的一种控制流程结构,常常用于循环。
这种结构被用来跳过当前循环中的剩余语句,并继续下一轮循环。
如果你正在处理列表或数组,则if continue在您的代码中非常有用。
在调试Shell脚本时,if continue也是一种非常有用的工具,可以帮助排除代码中的错误。
shell for continue的用法
shell for continue的用法在Shell编程中,我们经常需要使用循环结构来重复执行一段代码。
其中,continue语句是一个非常有用的关键字,可以用于跳过当前循环中剩余的代码,直接进入下一轮循环的开始。
下面将介绍如何使用Shell的continue语句。
在Shell脚本中,continue语句通常与if语句和循环语句(如for循环和while循环)一起使用。
当某个条件成立时,我们可以使用continue语句跳过剩余的代码,返回循环的开头重新开始下一轮循环。
下面是一个示例,展示如何在for循环中使用continue语句:```shell#!/bin/bashfor (( i=1; i<=10; i++ ))doif (( i % 2 == 0 ))thencontinuefiecho "当前数字为:$i"done```在上面的示例中,我们使用了for循环来迭代变量i从1到10。
如果i能被2整除,也就是偶数,那么执行continue语句,直接跳过下面的echo语句,返回循环的开头开始下一轮循环。
如果i不能被2整除,也就是奇数,那么输出当前数字i。
运行以上示例脚本,将输出如下内容:```当前数字为:1当前数字为:3当前数字为:5当前数字为:7当前数字为:9```可以看到,当i为偶数时,continue语句起到了跳过echo语句的作用,只输出了奇数。
需要注意的是,continue语句只能用于循环结构中,例如for循环和while循环,并且只会跳过当前循环中的剩余代码,直接开始下一轮循环。
如果在没有嵌套循环的情况下使用continue语句,将会导致语法错误。
综上所述,Shell编程中的continue语句用于跳过当前循环中剩余的代码,直接进入下一轮循环的开始。
通过合理运用continue语句,我们可以在循环结构中实现更复杂的逻辑控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Shell 循环基础处理命令行自变量的简单技巧,然后再看看bash 基本编程结构。
接收自变量在介绍性文章中的样本程序中,我们使用环境变量"$1" 来引用第一个命令行自变量。
类似地,可以使用"$2"、"$3" 等来引用传递给脚本的第二和第三个自变量。
这里有一个例子:除以下两个细节之外,此例无需说明。
第一,"$0" 将扩展成从命令行调用的脚本名称,"$#" 将扩展成传递给脚本的自变量数目。
试验以上脚本,通过传递不同类型的命令行自变量来了解其工作原理。
有时需要一次引用所有命令行自变量。
针对这种用途,bash 实现了变量"$@",它扩展成所有用空格分开的命令行参数。
在本文稍后的"for" 循环部分中,您将看到使用该变量的例子。
Bash 编程结构如果您曾用过如C、Pascal、Python 或Perl 那样的过程语言编程,则一定熟悉"if" 语句和"for" 循环那样的标准编程结构。
对于这些标准结构的大多数,Bash 有自己的版本。
在下几节中,将介绍几种bash 结构,并演示这些结构和您已经熟悉的其它编程语言中结构的差异。
如果以前编程不多,也不必担心。
我提供了足够的信息和示例,使您可以跟上本文的进度。
方便的条件语句如果您曾用C 编写过与文件相关的代码,则应该知道:要比较特定文件是否比另一个文件新需要大量工作。
那是因为 C 没有任何内置语法来进行这种比较,必须使用两个stat() 调用和两个stat 结构来进行手工比较。
相反,bash 内置了标准文件比较运算符,因此,确定“/tmp/myfile 是否可读”与查看“$myvar 是否大于4”一样容易。
下表列出最常用的bash 比较运算符。
同时还有如何正确使用每一选项的示例。
示例要跟在"if" 之后。
例如:运算符描述示例文件比较运算符-e filename 如果filename存在,则为真[ -e /var/log/syslog ] -d filename 如果filename为目录,则为真[ -d /tmp/mydir ]-f filename 如果filename为常规文件,则为真[ -f /usr/bin/grep ]-L filename 如果filename为符号链接,则为真[ -L /usr/bin/grep ] -r filename 如果filename可读,则为真[ -r /var/log/syslog ] -w filename 如果filename可写,则为真[ -w /var/mytmp.txt ] -x filename 如果filename可执行,则为真[ -L /usr/bin/grep ]filename1-nt filename2 如果filename1比filename2新,则为真[ /tmp/install/etc/services -nt/etc/services ]filename1-ot filename2 如果filename1比filename2旧,则为真[ /boot/bzImage -otarch/i386/boot/bzImage ]字符串比较运算符(请注意引号的使用,这是防止空格扰乱代码的好方法)-z string 如果string长度为零,则为真[ -z "$myvar" ]-n string 如果string长度非零,则为真[ -n "$myvar" ]string1= string2 如果string1与string2相同,则为真[ "$myvar" = "one two three" ]string1!= string2 如果string1与string2不同,则为真[ "$myvar" != "one two three" ] 算术比较运算符num1-eq num2 等于[ 3 -eq $mynum ]num1-ne num2 不等于[ 3 -ne $mynum ]num1-lt num2 小于[ 3 -lt $mynum ]num1-le num2 小于或等于[ 3 -le $mynum ]num1-gt num2 大于[ 3 -gt $mynum ]num1-ge num2 大于或等于[ 3 -ge $mynum ]有时,有几种不同方法来进行特定比较。
例如,以下两个代码段的功能相同:上面两个比较执行相同的功能,但是第一个使用算术比较运算符,而第二个使用字符串比较运算符。
字符串比较说明大多数时候,虽然可以不使用括起字符串和字符串变量的双引号,但这并不是好主意。
为什么呢?因为如果环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。
这里有一个错误的比较示例:在上例中,如果myvar 等于"foo",则代码将按预想工作,不进行打印。
但是,如果myvar 等于"foo bar oni",则代码将因以下错误失败:在这种情况下,"$myvar"(等于"foo bar oni")中的空格迷惑了bash。
bash 扩展"$myvar" 之后,代码如下:因为环境变量没放在双引号中,所以bash 认为方括号中的自变量过多。
可以用双引号将字符串自变量括起来消除该问题。
请记住,如果养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。
"foo bar oni" 比较应该写成:以上代码将按预想工作,而不会有任何令人不快的意外出现。
循环结构:"for"好了,已经讲了条件语句,下面该探索bash 循环结构了。
我们将从标准的"for" 循环开始。
这里有一个简单的例子:发生了什么?"for" 循环中的"for x" 部分定义了一个名为"$x" 的新环境变量(也称为循环控制变量),它的值被依次设置为"one"、"two"、"three" 和"four"。
每一次赋值之后,执行一次循环体("do" 和"done" 之间的代码)。
在循环体内,象其它环境变量一样,使用标准的变量扩展语法来引用循环控制变量"$x"。
还要注意,"for" 循环总是接收"in" 语句之后的某种类型的字列表。
在本例中,指定了四个英语单词,但是字列表也可以引用磁盘上的文件,甚至文件通配符。
看看下面的例子,该例演示如何使用标准shell 通配符:以上代码列出在/etc 中每个以"r" 开头的文件。
要做到这点,bash 在执行循环之前首先取得通配符输出行。
还可以在字列表中使用多个通配符、甚至是环境变量:Bash 将在所有正确位置上执行通配符和环境变量扩展,并可能创建一个非常长的字列表。
虽然所有通配符扩展示例使用了绝对路径,但也可以使用相对路径,如下所示:在上例中,bash 相对于当前工作目录执行通配符扩展,就象在命令行中使用相对路径一样。
研究一下通配符扩展。
您将注意到,如果在通配符中使用绝对路径,bash 将通配符扩展成一个绝对路径列表。
否则,bash 将在后面的字列表中使用相对路径。
如果只引用当前工作目录中的文件(例如,如果输入"for x in *"),则产生的文件列表将没有路径信息的前缀。
请记住,可以使用"basename" 可执行程序来除去前面的路径信息,如下所示:当然,在脚本的命令行自变量上执行循环通常很方便。
这里有一个如何使用本文开始提到的"$@" 变量的例子:Shell 算术在学习另一类型的循环结构之前,最好先熟悉如何执行shell 算术。
是的,确实如此:可以使用shell 结构来执行简单的整数运算。
只需将特定的算术表达式用"$((" 和"))" 括起,bash 就可以计算表达式。
这里有一些例子:更多的循环结构:"while" 和"until"只要特定条件为真,"while" 语句就会执行,其格式如下:通常使用"While" 语句来循环一定次数,比如,下例将循环10 次:可以看到,上例使用了算术表达式来使条件最终为假,并导致循环终止。
"Until" 语句提供了与"while" 语句相反的功能:只要特定条件为假,它们就重复。
下面是一个与前面的"while" 循环具有同等功能的"until" 循环:Case 语句Case 语句是另一种便利的条件结构。
这里有一个示例片段:在上例中,bash 首先扩展"${x##*.}"。
在代码中,"$x" 是文件的名称,"${x##.*}" 除去文件中最后句点后文本之外的所有文本。
然后,bash 将产生的字符串与")" 左边列出的值做比较。
在本例中,"${x##.*}" 先与"gz" 比较,然后是"bz2",最后是"*"。
如果"${x##.*}" 与这些字符串或模式中的任何一个匹配,则执行紧接")" 之后的行,直到";;" 为止,然后bash 继续执行结束符"esac" 之后的行。
如果不匹配任何模式或字符串,则不执行任何代码行,在这个特殊的代码片段中,至少要执行一个代码块,因为任何不与"gz" 或"bz2" 匹配的字符串都将与"*" 模式匹配。
函数与名称空间在bash 中,甚至可以定义与其它过程语言(如Pascal 和C)类似的函数。
在bash 中,函数甚至可以使用与脚本接收命令行自变量类似的方式来接收自变量。
让我们看一下样本函数定义,然后再从那里继续:我们在上面定义了一个名为 "tarview" 的函数,它接收一个自变量,即某种类型的 tar 文件。