WQhuanm
shell 学习笔记

shell 学习笔记

基本语法

  1. #! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )

  2. 变量 :shell的基本变量都是字符串

  • 变量的引用方式如下
    • “$变量名” :shell把空格视为分隔符/换行符,使用”“包含时才能确保视字符串为一个整体,不被分隔
    • ${变量名},可以对变量(var)的值进行编辑
      • ${var:-default} :如果var为空或未定义,则使用 default 作为其值,但不改变var的值,使用=则改变var值
      • ${var#str}:删除开头到第一次出现的str之间的内容(包括str,str支持正则)
        • ##表示则删除开头到最后一次出现之间,%则是从结尾开始删除
      • ${var/old/new}:将第一个匹配的 old 替换为 new(//old/new 则是把所有匹配的都替换)
  • 变量赋值
    • = 赋值时,右侧为空,则变量值为空
    • =()即可赋值为数组,数组元素以空格分隔
    • (date) )
  • 可以使用(())egc=((a + b)) )
  1. 参数获取
  • $i :获取脚本的第i个参数,0表示脚本名称
  • $# :参数总数
  • $@ :把每个参数视为一个独立字符串
  • $* :把所有参数整体视为一个字符串
  • $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
  1. []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
  • [[]] 不会对内部字符进行转义,支持更多操作
  • 比较符号
    • 字符串比较: == (相等), != (不相等), -z (是空字符串)
    • 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
    • 文件判断: -f (是文件), -d (是目录), -e (存在)
  • if/while使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
    echo "true"
    else
    echo "false"
    fi

    while [ $a lt 10 ]; do
    echo $a
    done
  1. for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
  • 遍历参数
    • 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
    • 遍历@,*,字符串时 :参数会被空格分隔
    • “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
  • 遍历数组
    • 使用”{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和*相似
      1
      2
      3
      for fruit in "${fruits[@]}"; do
      echo "水果: $fruit"
      done

常见命令

  1. THIS_DIR=$(dirname readlink -f "$0") :获取脚本所在目录
  • readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
  • dirname :去除当前路径的最后一级
  1. set [options] :控制脚本的执行方式
  • -x :打印所有执行的命令,用于调试
  • -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
  • -u(nounset) :访问未定义变量时立刻终止并报错
  • -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
  1. source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
  • 也可写为 . [filename]
  1. mapfile [options] [数组变量] < [stdin] :将指定内容读取为一个数组
  • -t :从每一行末尾移除分隔符
  • -d[分隔字符] :指定分隔字符(不再按行分隔,比如 -d, -d’’ 按逗号,空字符分隔)— title: shell 学习笔记 date: 2025-08-26 03:21:16 mathjax: true categories:
    • CS基础 tags:
    • Linux cover: https://gcore.jsdelivr.net/gh/WQhuanm/Img_repo_1@main/img/202412222015910.png —

基本语法

  1. #! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )

  2. 变量 :shell的基本变量都是字符串

  • 变量的引用方式如下
    • “$变量名” :shell把空格视为分隔符/换行符,使用”“包含时才能确保视字符串为一个整体,不被分隔
    • ${变量名},可以对变量(var)的值进行编辑
      • ${var:-default} :如果var为空或未定义,则使用 default 作为其值,但不改变var的值,使用=则改变var值
      • ${var#str}:删除开头到第一次出现的str之间的内容(包括str,str支持正则)
        • ##表示则删除开头到最后一次出现之间,%则是从结尾开始删除
      • ${var/old/new}:将第一个匹配的 old 替换为 new(//old/new 则是把所有匹配的都替换)
  • 变量赋值
    • = 赋值时,右侧为空,则变量值为空
    • =()即可赋值为数组,数组元素以空格分隔
    • (date) )
  • 可以使用(())egc=((a + b)) )
  1. 参数获取
  • $i :获取脚本的第i个参数,0表示脚本名称
  • $# :参数总数
  • $@ :把每个参数视为一个独立字符串
  • $* :把所有参数整体视为一个字符串
  • $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
  1. []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
  • [[]] 不会对内部字符进行转义,支持更多操作
  • 比较符号
    • 字符串比较: == (相等), != (不相等), -z (是空字符串)
    • 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
    • 文件判断: -f (是文件), -d (是目录), -e (存在)
  • if/while使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
    echo "true"
    else
    echo "false"
    fi

    while [ $a lt 10 ]; do
    echo $a
    done
  1. for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
  • 遍历参数
    • 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
    • 遍历@,*,字符串时 :参数会被空格分隔
    • “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
  • 遍历数组
    • 使用”{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和*相似
      1
      2
      3
      for fruit in "${fruits[@]}"; do
      echo "水果: $fruit"
      done

常见命令

  1. THIS_DIR=$(dirname readlink -f "$0") :获取脚本所在目录
  • readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
  • dirname :去除当前路径的最后一级
  1. set [options] :控制脚本的执行方式
  • -x :打印所有执行的命令,用于调试
  • -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
  • -u(nounset) :访问未定义变量时立刻终止并报错
  • -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
  1. source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
  • 也可写为 . [filename]
  1. mapfile [options] [数组变量] < [stdin] :将指定内容读取为一个数组
  • -t :从每一行末尾移除分隔符
  • -d[分隔字符] :指定分隔字符(不再按行分隔,比如 -d, -d’’ 按逗号,空字符分隔)— title: shell 学习笔记 date: 2025-08-26 03:21:16 mathjax: true categories:
    • CS基础 tags:
    • Linux cover: https://gcore.jsdelivr.net/gh/WQhuanm/Img_repo_1@main/img/202412222015910.png —

基本语法

  1. #! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )

  2. 变量 :shell的基本变量都是字符串

  • 变量的引用方式如下
    • “$变量名” :shell把空格视为分隔符/换行符,使用”“包含时才能确保视字符串为一个整体,不被分隔
    • ${变量名},可以对变量(var)的值进行编辑
      • ${var:-default} :如果var为空或未定义,则使用 default 作为其值,但不改变var的值,使用=则改变var值
      • ${var#str}:删除开头到第一次出现的str之间的内容(包括str,str支持正则)
        • ##表示则删除开头到最后一次出现之间,%则是从结尾开始删除
      • ${var/old/new}:将第一个匹配的 old 替换为 new(//old/new 则是把所有匹配的都替换)
  • 变量赋值
    • = 赋值时,右侧为空,则变量值为空
    • =()即可赋值为数组,数组元素以空格分隔
    • $()/`` : 命令替换 ,会把内部命令结果作为值引用(eg:A=$(date)
  • 可以使用$(()) 将变量解释为数字 来进行运算(eg:c=$((a + b))
  1. 参数获取
  • $i :获取脚本的第i个参数,0表示脚本名称
  • $# :参数总数
  • $@ :把每个参数视为一个独立字符串
  • $* :把所有参数整体视为一个字符串
  • $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
  1. []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
  • [[]] 不会对内部字符进行转义,支持更多操作
  • 比较符号
    • 字符串比较: == (相等), != (不相等), -z (是空字符串)
    • 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
    • 文件判断: -f (是文件), -d (是目录), -e (存在)
  • if/while使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
    echo "true"
    else
    echo "false"
    fi

    while [ $a lt 10 ]; do
    echo $a
    done
  1. for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
  • 遍历参数
    • 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
    • 遍历$@,$*,字符串时 :参数会被空格分隔
    • “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
  • 遍历数组
    • 使用”{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和*相似
      1
      2
      3
      for fruit in "${fruits[@]}"; do
      echo "水果: $fruit"
      done

常见命令

  1. THIS_DIR=$(dirname readlink -f "$0") :获取脚本所在目录
  • readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
  • dirname :去除当前路径的最后一级
  1. set [options] :控制脚本的执行方式
  • -x :打印所有执行的命令,用于调试
  • -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
  • -u(nounset) :访问未定义变量时立刻终止并报错
  • -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
  1. source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
  • 也可写为 . [filename]
  1. mapfile [options] [数组变量] < [stdin] :将指定内容读取为一个数组
  • -t :从每一行末尾移除分隔符
  • -d[分隔字符] :指定分隔字符(不再按行分隔,比如 -d, -d’’ 按逗号,空字符分隔)
本文作者:WQhuanm
本文链接:https://wqhuanm.github.io/Issue_Blog/2025/08/25/47_shell.学习笔记/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可