• 008.分隔符、循环、比较


    1、字段分隔符与迭代器

    内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念。在处理文本数据时,它的作用可不小。

    作为分隔符,IFS有其特殊用途。它是一个环境变量,其中保存了用于分隔的字符。它是当前shell环境使用的默认定界字符串。

    考虑一种情形:我们需要迭代一个字符串或逗号分隔型数值(Comma Separated Value,CSV)中的单词。如果是前者,可以使用IFS=" ";如果是后者,则使用IFS=","。

    1. #!/bin/bash
    2. data="name,gender,rollno,location"
    3. oldIFS=$IFS
    4. IFS=,
    5. for item in $data;
    6. do
    7. echo Item: $item
    8. done
    9. IFS=$oldIFS

    • IFS的默认值为空白字符(换行符、制表符或者空格)。
    • 当IFS被设置为逗号时,shell将逗号视为一个定界符,因此变量$item在每次迭代中读取由逗号分隔的子串作为变量值。
    • 如果没有把IFS设置成逗号,那么上面的脚本会将全部数据作为单个字符串打印出来。

    案例:

    以/etc/passwd为例,看看IFS的另一种用法。在文件/etc/passwd中,每一行包含了由冒号分隔的多个条目。该文件中的每行都对应着某个用户的相关属性。

    考虑这样的输入:root:x:0:0:root:/root:/bin/bash。每行的最后一项指定了用户的默认shell。可以按照下面的方法巧妙地利用IFS打印出用户以及他们默认的shell:

    1. #!/bin/bash
    2. #用途:演示IFS的用法
    3. line="root:x:0:0:root:/root:/bin/bash"
    4. oldIFS=$IFS;
    5. IFS=":"
    6. count=0
    7. for item in $line;
    8. do
    9. [ $count -eq 0 ] && user=$item;
    10. [ $count -eq 6 ] && shell=$item;
    11. let count++
    12. done;
    13. IFS=$oldIFS
    14. echo "$user's shell is $shell";
    15. # 结果输出:root's shell is /bin/shell
    2、循环
    a. for循环
    1. # 面向列表的for循环
    2. for var in list;
    3. do
    4. commands; # 使用变量$var
    5. done
    • list可以是一个字符串,也可以是一个值序列。

    我们可以使用echo命令生成各种值序列:

    1. echo {1..50}; # 生成一个从1~50的数字序列
    2. echo {a..z} {A..Z}; # 生成大小写字母序列
    3. # 量i在每次迭代的过程里都会保存一个范围在a到z之间的字符:
    4. for i in {a..z}; do actions; done;

    迭代指定范围的数字:

    1. for((i=0;i<10;i++))
    2. {
    3. command; # 使用变量$i
    4. }
    b. while循环

    当条件为真时,while循环继续执行;当条件不为真时,until循环继续执行。

    1. while condition
    2. do
    3. commands;
    4. done
    c. until循环

    在Bash中还可以使用一个特殊的循环until。它会一直循环,直到给定的条件为真。

    1. x=0;
    2. until [ $x -eq 9 ]; # 条件是[$x -eq 9]
    3. do
    4. let x++; echo $x;
    5. done
    3、比较与测试

    程序中的流程控制是由比较语句和测试语句处理的。Bash能够执行各种测试。我们可以用if、ifelse以及逻辑运算符来测试,用比较运算符来比较数据项。除此之外,还有一个test命令也可以用于测试。

    if条件:

    1. if condition;
    2. then
    3. commands;
    4. fi

    else if 和 else

    1. if condition;
    2. then
    3. commands;
    4. else if condition;
    5. then
    6. commands;
    7. else
    8. commands;
    9. fi
    a. 文件测试

    可以使用不同的条件标志测试各种文件系统相关的属性:

    [ -f $var ]

    如果给定的变量包含正常的文件路径或文件名,则返回真。

    [ -x $var ]

    如果给定的变量包含的文件可执行,则返回真。

    [ -d $var ]

    如果给定的变量包含的是目录,则返回真。

    [ -e $var ]

    如果给定的变量包含的文件存在,则返回真。

    [ -c $var ]

    如果给定的变量包含的是一个字符设备文件的路径,则返回真。

    [ -b $var ]

    如果给定的变量包含的是一个块设备文件的路径,则返回真。

    [ -w $var ]

    如果给定的变量包含的文件可写,则返回真。

    [ -r $var ]

    如果给定的变量包含的文件可读,则返回真。

    [ -L $var ]

    如果给定的变量包含的是一个符号链接,则返回真

    1. #!/bin/bash
    2. fpath="/etc/passwd"
    3. if [ -e $fpath ];
    4. then
    5. echo File exists;
    6. else
    7. echo Does not exist;
    8. fi
    b. 字符串测试

    进行字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。

    注意:双中括号是Bash的一个扩展特性。如果出于性能考虑,使用ash或dash来运行脚本,那么将无法使用该特性。

    注意:在=前后各有一个空格。如果忘记加空格,那就不是比较关系了,而是变成了赋值语句。

    测试两个字符串是否相同:

    1. # 当str1等于str2时,返回真。也就是说,str1和str2包含的文本是一模一样的。
    2. [[ $str1 = $str2 ]]
    3. # 这是检查字符串是否相同的另一种写法。
    4. [[ $str1 == $str2 ]]

    检测两个字符串是否不相等:

    1. # 如果str1和str2不相同,则返回真
    2. [[ $str1 != $str2 ]]

    找出在字母表中靠后的字符串:字符串是依据字符的ASCII值进行比较的。例如,A的值是0x41,a的值是0x61。因此,A小于a,AAa小于Aaa。

    1. # 如果str1的字母序比str2大,则返回真。
    2. [[ $str1 > $str2 ]]
    3. # 如果str1的字母序比str2小,则返回真。
    4. [[ $str1 < $str2 ]]

    测试空串:

    1. # 如果str1为空串,则返回真。
    2. [[ -z $str1 ]]
    3. # 如果str1不为空串,则返回真。
    4. [[ -n $str1 ]]
    c. test命令测试

    test命令可以用来测试条件。用test可以避免使用过多的括号,增强代码的可读性。之前讲过的[]中的测试条件同样可以用于test命令。

    1. if [ $var -eq 0 ]; then echo "True"; fi
    2. if test $var -eq 0 ; then echo "True"; fi

    注意,test是一个外部程序,需要衍生出对应的进程,而 [ 是Bash的一个内部函数,因此后者的执行效率更高。test兼容于Bourne shell、ash、dash等。

    ------------------------------------

    4、运算符
    a. 逻辑运算符

    &&是逻辑与运算符,||是逻辑或运算符。编写Bash脚本时,这是一个很有用的技巧。

    1. [ condition ] && action; # 如果condition为真,则执行action
    2. [ condition ] || action; # 如果condition为假,则执行action

    -a是逻辑与操作符,-o是逻辑或操作符。可以按照下面的方法结合多个条件进行测试:

    1. [ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与-a
    2. [ $var1 -ne 0 -o $var2 -gt 2 ] #逻辑或-o

    使用逻辑运算符 && 和 || 能够很容易地将多个条件组合起来:

    1. if [[ -n $str1 ]] && [[ -z $str2 ]];
    2. then
    3. commands;
    4. fi
    1. #!/bin/bash
    2. str1="Not empty"
    3. str2=""
    4. if [[ -n $str1 ]] && [[ -z $str2 ]];
    5. then
    6. echo str1 is nonempty and str2 is empty string.
    7. fi
    b. 算术运算符

    比较条件通常被放置在封闭的中括号内。一定要注意在[或]与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错:[$var -eq 0 ] or [ $var -eq 0]

    对变量或值进行算术条件测试:

    1. [ $var -eq 0 ] #当$var等于0时,返回真
    2. [ $var -ne 0 ] #当$var不为0时,返回真
    • -gt:大于。
    • -lt:小于。
    • -ge:大于或等于。
    • -le:小于或等于

  • 相关阅读:
    2022年前端还好找工作吗?
    crontab和cron表达式详解
    Python3 数据类型转换
    排序概述笔记
    Java实现加密(一)AES加解密
    mysql的max_allowed_packet配置
    单点登录方法
    融合动态反向学习的阿奎拉鹰与哈里斯鹰混合优化算法
    为什么你的抖店总做不好?原因就在这里,你中招了吗?
    ROS自学笔记十三:VScode的介绍和安装
  • 原文地址:https://blog.csdn.net/Yuanshigou9/article/details/134415549