• shell脚本编写辅助命令


    目录

    一、echo 命令

    二、字符串相关操作

    1.截取字符串

    2.获取字符串长度

    3.字符串追加字符

    4.从开头或结尾删除字符串指定格式内容

    三、随机数

    1.使用 $RANDOM

    2.指定RANDOM变量的范围

    (1)从0开始的范围

    (2)从指定数始的范围

    四、从文件获取循环语句的取值

    1.for 循环从文件取值

    2. while 循环从文件取值

    五、IFS变量指定字段分隔符

    1.查看IFS变量指定的字段分隔符

    2.永久修改字段分隔符 

    3.临时修改字段分隔符 


    一、echo 命令

    echo [选项] ...       将指定内容(字符、变量、命令等)标准输出到屏幕

               -n               不换行输出(默认是换行输出)

               -e               输出转义字符,将转义后的内容输出

    -e 支持输出内容常用转义字符

    转义字符作用
    \b转义后相当于退格键(删除前一个字符,可使用多次)
    \c

    不换行输出,在“\c”后面不存在字符的情况下,相当于echo -n

                          在“\c”后面存在字符的情况下,后面的字符不会被输出

    \n换行,被输出的字符从“\n”处开始另起一行输出
    \f换行,“\f”后换行输出的字符,开头从上一行结尾开始
    \v与“\f”相同
    \t转义后相当于插入tab制表符
    \r光标移至行首(不换行)将\r后的字符从头输出,覆盖原有长度的内容
    \\输出特殊字符本身,如\\ 输出\ 本身,\$ 输出 $本身
    1. [root@localhost1 ~]#echo "abcd" && echo "abcd"
    2. abcd
    3. abcd
    4. [root@localhost1 ~]#echo -n "abcd" && echo "abcd"
    5. abcdabcd
    6. [root@localhost1 ~]#echo -e "abcd\befg"
    7. abcefg
    8. [root@localhost1 ~]#echo -e "abcd\cefg"
    9. abcd
    10. [root@localhost1 ~]#echo -e "abcd\nefg"
    11. abcd
    12. efg
    13. [root@localhost1 ~]#echo -e "abcd\fefg"
    14. abcd
    15. efg
    16. [root@localhost1 ~]#echo -e "abcd\vefg"
    17. abcd
    18. efg
    19. [root@localhost1 ~]#echo -e "abcd\tefg"
    20. abcd efg
    21. [root@localhost1 ~]#echo -e "abcd\refg"
    22. efgd
    23. [root@localhost1 ~]#echo -e "\\ \$"
    24. \ $

    二、字符串相关操作

    1.截取字符串

    ${变量名:索引:长度} 

    注:索引是指一个字符串中,字符排序的编号,索引编号以0开头(第一个字符编号为0)

    1. //定义变量string
    2. [root@localhost1 ~]#string=nicetomeetyou
    3. //截取
    4. [root@localhost1 ~]#echo ${string:6:4}
    5. meet
    6. [root@localhost1 ~]#echo ${string:0:4}
    7. nice

    2.获取字符串长度

    ${#变量名}

    1. [root@localhost1 ~]#string=nicetomeetyou
    2. [root@localhost1 ~]#echo ${#string}
    3. 13

    3.字符串追加字符

    变量+=字符串或变量         //将原有的变量值后追加指定的字符串或变量值

    1. [root@localhost1 data]#vim string.sh
    2. #!/bin/bash
    3. string1=abcdefg
    4. string1+=hijk -- 追加字符串
    5. echo $string1
    6. string2="nice to meet "
    7. yourname=jack
    8. string2+=$yourname -- 追加变量的值
    9. echo $string2
    10. [root@localhost1 data]#bash string.sh
    11. abcdefghijk
    12. nice to meet jack

    4.从开头或结尾删除字符串指定格式内容

    echo ${变量名%指定格式内容}

    echo ${变量名%%指定格式内容}

    echo ${变量名#指定格式内容}

    echo ${变量名##指定格式内容} 

    %末尾往前匹配最短符合指定格式的内容并删除
    %%末尾往前匹配最长符合指定格式的内容并删除
    #开头往后匹配最短符合指定格式的内容并删除
    ##开头往后匹配最长符合指定格式的内容并删除
    指定格式内容字符串中符合某个内容特征的格式(如:*是以:开头后面有若干字符)

    最短符合可理解为只有一段满足指定格式的内容;最长符合可理解为所有满足指定格式的内容。

    1. //定义一个变量i
    2. [root@localhost1 ~]#i="11,22,33,44"
    3. [root@localhost1 ~]#echo $i
    4. 11,22,33,44
    5. //对$i中从结尾开始最短满足,*格式的内容进行删除
    6. [root@localhost1 ~]#echo ${i%,*}
    7. 11,22,33
    8. //对$i中从结尾开始最长满足,*格式的内容进行删除
    9. [root@localhost1 ~]#echo ${i%%,*}
    10. 11
    11. //对$i中从开头开始最短满足*,格式的内容进行删除
    12. [root@localhost1 ~]#echo ${i#*,}
    13. 22,33,44
    14. //对$i中从开头开始最长满足*,格式的内容进行删除
    15. [root@localhost1 ~]#echo ${i##*,}
    16. 44
    17. //对$i中从结尾开始最短满足*,*,格式的内容进行删除
    18. [root@localhost1 ~]#echo ${i#*,*,}
    19. 33,44

    三、随机数

    1.使用 $RANDOM

    $ RANDOM        //RANDOM变量可以生成随机数(默认范围 0 ~ 32767)

    1. [root@localhost1 ~]#echo $RANDOM
    2. 6584
    3. [root@localhost1 ~]#echo $RANDOM
    4. 14161

    2.指定RANDOM变量的范围

    (1)从0开始的范围

    $[ RANDOM % n ]        //n代表指定数字,使用取余操作可实现指定随机数范围( 0 ~ n-1)

    1. //取 0~9 的随机数
    2. [root@localhost1 ~]#echo $[RANDOM % 10]
    3. 0
    4. [root@localhost1 ~]#echo $[RANDOM % 10]
    5. 4
    6. [root@localhost1 ~]#echo $[RANDOM % 10]
    7. 6
    8. [root@localhost1 ~]#echo $[RANDOM % 10]
    9. 8

    (2)从指定数始的范围

    $[ RANDOM % n + x ]        //x为指定数字,n 后加上 x ,代表的随机数范围是( x ~ n-1+x)

    1. //取 1~100 范围的随机数
    2. [root@localhost1 ~]#echo $[RANDOM % 100 + 1]
    3. 38
    4. [root@localhost1 ~]#echo $[RANDOM % 100 + 1]
    5. 49
    6. [root@localhost1 ~]#echo $[RANDOM % 100 + 1]
    7. 76
    8. [root@localhost1 ~]#echo $[RANDOM % 100 + 1]
    9. 12

    四、从文件获取循环语句的取值

            首先创建文件用于下面的脚本取值,这里每个取值使用换行符分割,实际上每个取值默认可以通过空格、制表符、换行符

    1. //创建文件用于脚本取值
    2. [root@localhost1 ifstest]#vim value.txt
    3. zhangsan
    4. lisi
    5. wangwu
    6. zhaoliu
    7. qianqi
    8. zhuba

    1.for 循环从文件取值

    for 变量名 in $(cat 文件位置)

    do

        命令序列

    done

    1. //for 循环从文件取值
    2. [root@localhost1 ifstest]#vim CatchFileValue.sh
    3. #!/bin/bash
    4. for i in $(cat /ifstest/value.txt)
    5. do
    6. echo $i
    7. done
    8. [root@localhost1 ifstest]#bash CatchFileValue.sh
    9. zhangsan
    10. lisi
    11. wangwu
    12. zhaoliu
    13. qianqi
    14. zhuba

    2. while 循环从文件取值

    while read 变量名

    do

        命令序列

    done < file

    1. [root@localhost1 ifstest]#vim CatchFileValue.sh
    2. #!/bin/bash
    3. while read i
    4. do
    5. echo $i
    6. done < /ifstest/value.txt
    7. [root@localhost1 ifstest]#bash CatchFileValue.sh
    8. zhangsan
    9. lisi
    10. wangwu
    11. zhaoliu
    12. qianqi
    13. zhuba

    cat 文件位置 | while read 变量名

    do

        命令序列

    done 

    1. [root@localhost1 ifstest]#vim CatchFileValue.sh
    2. #!/bin/bash
    3. cat /ifstest/value.txt | while read i
    4. do
    5. echo $i
    6. done
    7. [root@localhost1 ifstest]#bash CatchFileValue.sh
    8. zhangsan
    9. lisi
    10. wangwu
    11. zhaoliu
    12. qianqi
    13. zhuba

    五、IFS变量指定字段分隔符

    1.查看IFS变量指定的字段分隔符

    [root@localhost ~]# set | grep IFS   //使用此命令可以查看IFS指定的字段分隔符

    -- IFS变量指定的字段分隔符默认为 (空格)、\t(tab制表符)、\n(enter换行符)

    1. [root@localhost1 ~]#set | grep IFS
    2. IFS=$' \t\n'
    3. local i IFS='
    4. local i IFS=" "'
    5. local i IFS=" "'
    6. local i IFS='
    7. local i IFS='
    8. local c i=0 IFS='
    9. local IFS='
    10. local IFS='
    11. local option option2 i IFS='
    12. IFS='
    13. local IFS='
    14. local IFS='
    15. local IFS='
    16. local IFS='
    17. local IFS='
    18. local IFS='
    19. local i IFS='
    20. local IFS='
    21. local i c='' IFS='
    22. local OIFS=$IFS IFS='
    23. IFS=$OIFS;
    24. local IFS='
    25. local IFS='
    26. local IFS='
    27. local IFS='

    2.永久修改字段分隔符 

    1. //直接修改IFS变量的值,可以实现永久修改字段分隔符
    2. [root@localhost1 ~]#IFS=$'/n'
    3. [root@localhost1 ~]#set | grep IFS
    4. IFS=/n -- 这里显示已经被修改成/n(换行符)
    5. local i IFS='
    6. local i IFS=" "'
    7. local i IFS=" "'
    8. local i IFS='
    9. ...

    3.临时修改字段分隔符 

    1. //指定文件用于循环语句取值
    2. [root@localhost2 ~]#vim value.txt
    3. zhang san
    4. li si
    5. wang wu
    6. zhao liu
    7. qian qi
    8. zhu ba
    9. //默认情况的$IFS会指定空格、制表符、换行符为字段分割符
    10. [root@localhost2 ~]#vim CatchFileValue.sh
    11. #!/bin/bash
    12. for i in `cat /root/value.txt`
    13. do
    14. echo $i
    15. done
    16. //文件中的值输出效果如下
    17. [root@localhost2 ~]#bash CatchFileValue.sh
    18. zhang san
    19. li si
    20. wang wu
    21. zhao liu
    22. qian qi
    23. zhu ba
    24. zhang
    25. san
    26. li
    27. si
    28. wang
    29. wu
    30. zhao
    31. liu
    32. qian
    33. qi
    34. zhu
    35. ba

    在一个脚本中,如果某段命令行程序需要使用特定的字段分隔符,可使用如下操作   

    IFSb=$IFS        -- 自定义一个变量,将$IFS的变量值赋给此变量

    IFS='\n'        -- 修改$IFS指定的字段分隔符

        命令序列        -- 修改后的命令序列将会使用修改后的$IFS指定的字段分隔符

    IFS=$IFSb        -- 将自定义的变量再赋值给$IFS,即恢复原本的$IFS

        命令序列        -- 之后的命令将不会受到之前修改的$IFS的影响 

    1. [root@localhost2 ~]#vim CatchFileValue.sh
    2. #!/bin/bash
    3. IFSb=$IFS
    4. IFS=$'\n' -- 将字段分割符改为\n(换行符)
    5. for i in `cat /root/value.txt`
    6. do
    7. echo $i
    8. done
    9. echo "------------"
    10. IFS=$IFSb -- 将原本的$IFS变量值恢复
    11. for j in `cat /root/value.txt`
    12. do
    13. echo $j
    14. done
    15. [root@localhost2 ~]#bash CatchFileValue.sh
    16. zhang san -- 实现只取换行符分割的字段
    17. li si
    18. wang wu
    19. zhao liu
    20. qian qi
    21. zhu ba
    22. ------------
    23. zhang --恢复后不受之前修改的影响,与原本输出效果相同
    24. san
    25. li
    26. si
    27. wang
    28. wu
    29. zhao
    30. liu
    31. qian
    32. qi
    33. zhu
    34. ba
  • 相关阅读:
    基于随机森林实现特征选择降维及回归预测(Matlab代码实现)
    【总结】云集各大高校 — 数学建模经验分享(万字总结)
    SQL:数据去重的三种方法
    会Python就能年薪40w?答案早就写在JD上了...
    面试经典 150 题 1 —(数组 / 字符串)— 88. 合并两个有序数组
    RemObjects Suite Subscription for Delphi
    Linux Bash Shell 中变量的 5 个易错点
    c++语言基础概述
    浅聊我和一些编程语言的缘分
    【Java】使用原生Java实现MVC的基本思路(廖雪峰Java学习笔记)
  • 原文地址:https://blog.csdn.net/weixin_58544496/article/details/126540697