Shell脚本学习笔记

todo list

符号的作用:

“” ‘’ `

${} () [] & IFS $[] $? $!

| >> < > <<

\0 \r \t $ ….

空格的影响

如何定义变量? 如何定义函数 ? 如何调用变量? 如何调用函数?

获取用户输入 read

数据处理之 cat. grep. tr. find. xargs.

tr 替换 删除

split 分割文件

关于函数中 echo 和return 在流中的体现

关于交互式命令、脚本的自动化 echo -e “ \n \n \n “

SHELL脚本学习笔记

写在最前面:

  1. 编写目的: 记录学习shell脚本中, 一些容易混淆、遗忘的知识点。
  2. 参考书籍: Linux Shell 脚本攻略 (其实市面上任一本SHELL编程书籍都可, 关键在于实际运用)
  3. 为什么要学习SHELL: 同学习Python目的差不多, 简单易上手, 方便快速开发, 在脚本编写初期使用SHELL+Python+现有工具 实现集成、自动化十分方便快捷。
    重点在于:命令执行 、结果处理 、结果保存
  4. 笔记结构: 第一部分记录一些语法,第二部分记录容易遗忘、混淆的知识点。

SHELL脚本基础

记录一些基础的东西(语法、常用命令等)

1. 输出命令

就输出命令来说, 我们更加关心自定义的变量如何输出、如何操控输出的格式, 在Shell脚本中,echoprintf 都可用于输出, 常用的为echo, 两者区别并不大。我们更加关注与其输出时使用的 **” “ , ‘ ‘ ,和` ` ** 的区别

  • 单引号
    以单引号' '包围变量的值时,会将其内容原样输出。

  • 双引号
    以双引号" "包围变量的值时,输出时会先解析里面的变量、命令和格式符号**(echo 需要加上-e 参数才能解析格式符号)** ,然后在输出。

    var1="HELLOWORLD"
    echo "$var1"
    
  • 反引号
    反引号 ` ` 会先解析内容, 然后将其当做命令执行

    echo `dir`
    
    # 其等价于下列命令, 反引号会先解析变量为dir  然后 将内容dir作为命令执行
    var1="dir"
    echo `$var1`
    
    # 在双引号中也可使用``
    echo "`date`"
    
  • 格式化输出变量

    # echo 和print 都可以用转义符号 \t  \n \r 等 ,echo 需要使用 -e来将转义符号进行解析
    echo -e " \t  Hello  \t world "
    # 而printf 命令可以使用格式替换福 %s %c %d等, 类似于C语言
    printf "%s %s %s \r" Hello world !
    

    关于两个命令更具体的使用可以用man echo ,man printf进行查看

2.变量

关于环境变量、以及变量处理

  • 环境变量
    环境变量可以在终端中输入env查看, 在bash中可以直接使用$ 符号调用已有的环境变量

    #当前使用的何种shell
    $SHELL 
    #也可使用$0查看
    $0
    
    #运行sh脚本时输入的参数
    $1 $2 $3
    
    #查看用户ID ,root为0
    $UID
    
  • 全局变量
    有时候在shell脚本中 会调用另一个shell脚本, 这时候通过export将要传递的变量设置为环境变量即可

    var1="Helloworld"
    #注意: export 后面的变量不需要$符号
    export var1
    
    #此时调用的其他脚本都可以访问var1 这个变量
    bash 2.sh
    
  • 其他
    数学运算(整数运算)

    # 数字赋值
    no1 =1 
    no2 =3
    
    # 使用let可直接进行数学运算, 注意使用let时变量不需要$符号
    let no3 =no1+no2
    echo $no3
    # 自增自减
    let no1++
    let no2--
    # [ ]  (())  expr和let使用方法相同
    
    no4=$[ no1+no2 ]
    no5=$((no1+no2))
    no6=`expr $no1 + $no2` #注意expr后面两个变量和运算符号之间有空格
    

    获取字符串长度

    #使用 ${#str}获取  
    var1=1234567890
    echo ${#var1}
    

3. 文件描述符、重定向、管道符号

在编写脚本的时候会频繁用到标准输入( stdin)、标准输出( stdout)和标准错误
( stderr)。

文件描述符是与某个打开的文件或数据流相关联的整数。 文件描述符0、 1以及2是系统预留的。

  • 0 —— stdin (标准输入)。
  • 1 —— stdout(标准输出)。
  • 2 —— stderr(标准错误)。

重定向符号有两种

  • 输出重定向: ,>> 和> ,两者的区别是 > 会将指向 的文件清空后写入, >> 是在尾部拼接
  • 输入重定向 <

| 管道符号, 将前一条命令的结果作为输入传递给后面的命令、

  • 标准流和重定向使用
#执行一条不存在的命令, 将错误信息输出到一个文件中

testforerror  2 > error.log

# &>  或 2>&1 表示将stdout 和stderr输出到某个文件中
cat *.txt &> errout.log

# 输入重定向使用举例: 将shell脚本中的命令传入bash中
bash < 5.sh
  • 创建一个新的文件描述符

    文件描述符可以看做一个指针变量,通过该变量我们可以对文件进行存取操作。注意0、1 、2是预留的描述符号,我们可以通过exec 命令结合重定向符号创建文件描述符

    # 创建一个读取文件的文件描述符并使用cat读取
    exec 3< text.txt
    # 即可进行读取
    cat  <&3
     
     
     # 创建用于写入 的文件描述符, >> 为追加模式 , > 为覆盖模式
     exec 5>>input.txt
     
    

4. ${} 对变量处理的使用

5. shell 的debug模式

6. 函数

函数的定义、传递的参数、返回值

  • 定义

    function fname()
    {
        statements;
    }
    或者
    fname()
    {
        statements;
    }
    
    
    #执行函数
     fname arg1 arg2
    
  • 参数访问

    $0是脚本名称。
    $1是第一个参数。
    $2是第二个参数。
    $n是第n个参数。
    $?接收上一条函数的执行结果
    "$@"被扩展成"$1" "$2" "$3"等。
    "$*"被扩展成"$1c$2c$3",是一个字符串,不常用
    
  • 返回值
    return 只能返回一个整型变量, 要返回字符串可以通过设置全局变量, 或者利用输出信息获取。

    #全局变量
    fun1()
    {
    
            s="$"
            export s
    }
    fun1 test
    
    echo $s
    
    
    # 输出信息
    get_str()
    {
        echo "string"
    }
    
    echo `get_str` #写法一
    echo $(get_str) #写法二
    

SHELL脚本应用

单引号和双引号的区别?如何改变终端输出的颜色? 如何结合Linux的命令对结果进行处理?

1. 单引号和双引号的区别

2. 控制终端输出颜色

有时候为了美化,可以对输出加上颜色控制
字体颜色范围为 3039 , 背景颜色范围为4049

更多设置可以使用man console_codes 查看

  • 字体颜色控制
    常用颜色码为: 重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。

  • 背景颜色控制
    常用颜色码为: 重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。

  • 使用方式 \e[1;字体颜色 或 背景颜色m 即可进行设置,若想同时设置 使用; 分开即可如 \e[1;33;44m

  • 重置 :使用 \e[0m

    echo -e "\e[1;33;45m Hello \e[1;37;42m world \e[0m"
    
    printf "\e[1;33;41m Hello \e[1;37;42m world \e[0m"
    

    image-20210815135301999

3. 字符匹配与替换

常用命令 tr 、sed 、awk 、grep …

4. 字符串转数字

结果保存

参考

image-20210815123054352


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1944270374@qq.com