太一的博客

一个程序学徒

shell

Shell 程序的第一行

  • 第一行: 指定用哪个程序来编译和执行脚本
    • #!/bin/bash
    • #!/bin/sh
    • #!/bin/csh
  • 注释行用 # 符号

变量概述

  • 变量命名

    • 变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。任何其它字符都标志变量名的结束
    • 变量名关于大小写敏感
  • 变量类型:

    • 根据变量的作用域,变量可以分为本地变量环境变量

    • 本地变量只在创建它们的 shell 程序中可用。而环境变量则在 Shell 中的所有用户进程中可用,通常也称为 全局变量

    • 环境变量称为全局变量,按照惯例需要大写

      export LANG

      • 注意:可被所有的 Shell 环境下访问;如果父进程 Shell 进程产生了子 Shell 进程,则环境变量可被“继承”并复制
    • 只读变量 是指不能被清除或者重新赋值的变量

      • #readonly myvar
  • 变量赋值:variable=value

    • 等号两边不能有空格
    • 如果要给变量赋空值,可以在等号后面跟一个换行符

变量常见操作

  • 显示变量的值
    • echo $variableecho ${variable}
  • 清除变量
    • unset variable

位置参量(命令行参数)

  • 位置参量是一组特殊的内置变量,通常被 shell 脚本用来 从命令行接受参数,或被函数用来保存传递给它的参数。
  • 执行 shell 脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用 空格 隔开的每个字符都称为位置参量。
  • 在脚本中使用这些参数时,需通过位置参量来引用。例如:**$1** 表示第一个参数,**$2** 表示第二个参数,以此类推。**$9** 以后需要用花括号把数字括起来,如第 10 个位置参量以 ${10} 的方式来访问。

image-20241004233618042

数组

  • 数组定义
    • arr=(math english chinese)
  • 数组初始化
    • arr=(math english chinese)
  • 数组引用
    • 引用变量:${arr[0]}
    • 数组个数:${#arr[*]}
    • 所有元素:${arr[*]}

输入输出

输入—— read命令

  • read var 从标准输入读取一行并赋值给变量 var
  • read 从标准输入读取一行并赋值给内置变量 REPLY
  • read -a arr 读取一组词,依次赋值给数组 arr

输出 —— echo 命令

  • 输出一行文本

    • echo "Hello World"
  • 输出一个变量值

  • echo $numecho ${num}

单引号、双引号、反引号区别

  • 单引号 忽略所有特殊字符

  • 双引号 忽略大部分特殊字符( $,` 等字符除外 )

  • 反引号 命令替换(将一个命令的标准输出插入到命令的任何位置)

    • $() 同上
  • 命令可以替换嵌套

    • 如果使用反引号,则内部的反引号必须用反斜杠来转义
    1
    2
    echo `basename \`pwd\``
    echo $(basename $(pwd))

条件测试

  • 条件测试可以根据某个特定条件是否满足,来选择执行相应的任务
  • Bash 中允许测试两种类型的条件:
    • 命令成功或失败,表达式为真或假
  • 任何一种测试中,都要有 退出状态(返回值),退出状态为 0 表示命令 成功 或表达式为 非0 则表示命令 失败 或表达式为假
  • 状态变量 $? 中保存命令退出状态的值

测试表达式的值

  • 表达式测试包括 字符串测试、整数测试文件测试

  • 内置测试命令 test

    • 通常用 test 命令来测试表达式的值
    1
    2
    x=5;y=10
    test $x -gt $y
    • **test ** 命令可以用 方括号 来代替
    1
    [ $y -gt $x ]

流编辑器 sed

  • sed 是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出。
  • 逐行读取文件内容存储在临时 缓冲区 中,称为“模式空间”( pattern space ),接着用 sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。源文件内容并没有改变。