
shell 学习笔记
基本语法
#! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )
变量 :shell的基本变量都是字符串
- 变量的引用方式如下
- “$变量名” :shell把空格视为分隔符/换行符,使用”“包含时才能确保视字符串为一个整体,不被分隔
- ${变量名},可以对变量(var)的值进行编辑
- ${var:-default} :如果var为空或未定义,则使用 default 作为其值,但不改变var的值,使用=则改变var值
- ${var#str}:删除开头到第一次出现的str之间的内容(包括str,str支持正则)
- ##表示则删除开头到最后一次出现之间,%则是从结尾开始删除
- ${var/old/new}:将第一个匹配的 old 替换为 new(//old/new 则是把所有匹配的都替换)
- 变量赋值
- = 赋值时,右侧为空,则变量值为空
- =()即可赋值为数组,数组元素以空格分隔
(date) )
- 可以使用(())将变量解释为数字来进行运算(eg:c=((a + b)) )
- 参数获取
- $i :获取脚本的第i个参数,0表示脚本名称
- $# :参数总数
- $@ :把每个参数视为一个独立字符串
- $* :把所有参数整体视为一个字符串
- $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
- []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
- [[]] 不会对内部字符进行转义,支持更多操作
- 比较符号
- 字符串比较: == (相等), != (不相等), -z (是空字符串)
- 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
- 文件判断: -f (是文件), -d (是目录), -e (存在)
- if/while使用
1
2
3
4
5
6
7
8
9if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
echo "true"
else
echo "false"
fi
while [ $a lt 10 ]; do
echo $a
done
- for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
- 遍历参数
- 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
- 遍历@,*,字符串时 :参数会被空格分隔
- “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
- 遍历数组
- 使用”
{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和 *相似 1
2
3for fruit in "${fruits[@]}"; do
echo "水果: $fruit"
done
- 使用”
常见命令
- THIS_DIR=$(dirname
readlink -f "$0"
) :获取脚本所在目录
- readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
- dirname :去除当前路径的最后一级
- set [options] :控制脚本的执行方式
- -x :打印所有执行的命令,用于调试
- -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
- -u(nounset) :访问未定义变量时立刻终止并报错
- -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
- source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
- 也可写为 . [filename]
- 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 —
基本语法
#! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )
变量 :shell的基本变量都是字符串
- 变量的引用方式如下
- “$变量名” :shell把空格视为分隔符/换行符,使用”“包含时才能确保视字符串为一个整体,不被分隔
- ${变量名},可以对变量(var)的值进行编辑
- ${var:-default} :如果var为空或未定义,则使用 default 作为其值,但不改变var的值,使用=则改变var值
- ${var#str}:删除开头到第一次出现的str之间的内容(包括str,str支持正则)
- ##表示则删除开头到最后一次出现之间,%则是从结尾开始删除
- ${var/old/new}:将第一个匹配的 old 替换为 new(//old/new 则是把所有匹配的都替换)
- 变量赋值
- = 赋值时,右侧为空,则变量值为空
- =()即可赋值为数组,数组元素以空格分隔
(date) )
- 可以使用(())将变量解释为数字来进行运算(eg:c=((a + b)) )
- 参数获取
- $i :获取脚本的第i个参数,0表示脚本名称
- $# :参数总数
- $@ :把每个参数视为一个独立字符串
- $* :把所有参数整体视为一个字符串
- $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
- []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
- [[]] 不会对内部字符进行转义,支持更多操作
- 比较符号
- 字符串比较: == (相等), != (不相等), -z (是空字符串)
- 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
- 文件判断: -f (是文件), -d (是目录), -e (存在)
- if/while使用
1
2
3
4
5
6
7
8
9if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
echo "true"
else
echo "false"
fi
while [ $a lt 10 ]; do
echo $a
done
- for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
- 遍历参数
- 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
- 遍历@,*,字符串时 :参数会被空格分隔
- “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
- 遍历数组
- 使用”
{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和 *相似 1
2
3for fruit in "${fruits[@]}"; do
echo "水果: $fruit"
done
- 使用”
常见命令
- THIS_DIR=$(dirname
readlink -f "$0"
) :获取脚本所在目录
- readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
- dirname :去除当前路径的最后一级
- set [options] :控制脚本的执行方式
- -x :打印所有执行的命令,用于调试
- -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
- -u(nounset) :访问未定义变量时立刻终止并报错
- -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
- source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
- 也可写为 . [filename]
- 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 —
基本语法
#! :解释器声明(申明使用哪个程序来执行该脚本,eg:#!/bin/bash )
变量 :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))
)
- 参数获取
- $i :获取脚本的第i个参数,0表示脚本名称
- $# :参数总数
- $@ :把每个参数视为一个独立字符串
- $* :把所有参数整体视为一个字符串
- $? :上一条命令的退出状态码(0 代表成功,非 0 代表失败)
- []/[[]] :条件判断(括号和括号里的内容均需空格分隔),常用判断符号如下
- [[]] 不会对内部字符进行转义,支持更多操作
- 比较符号
- 字符串比较: == (相等), != (不相等), -z (是空字符串)
- 数字比较: -eq (相等), -ne (不相等), -gt (大于), -lt (小于)
- 文件判断: -f (是文件), -d (是目录), -e (存在)
- if/while使用
1
2
3
4
5
6
7
8
9if [ ! -f "$A" ]; then # ;表示命令分隔,if和then是不同命令,需要换行或;分隔
echo "true"
else
echo "false"
fi
while [ $a lt 10 ]; do
echo $a
done
- for遍历(遍历时,通常要求变量被”“包含,避免元素被内部空格分隔)
- 遍历参数
- 遍历”$@“时 :会把每个参数视为一个独立字符串,并确保带空格的参数不被分隔(比如参数”b c” 不被分隔成参数b和c)
- 遍历
$@,$*
,字符串时 :参数会被空格分隔 - “$*” :所有参数被视为整体,且这个整体不被分隔,即循环只有一个元素
- 遍历数组
- 使用”
{var[*]}” 引用数组 ,[@/*]表示引用所有数组元素,意义和 *相似 1
2
3for fruit in "${fruits[@]}"; do
echo "水果: $fruit"
done
- 使用”
常见命令
- THIS_DIR=$(dirname
readlink -f "$0"
) :获取脚本所在目录
- readlink -f :将一个相对路径/软链接,转为源文件的绝对路径
- dirname :去除当前路径的最后一级
- set [options] :控制脚本的执行方式
- -x :打印所有执行的命令,用于调试
- -e(errexit) :快速失败,任何命令以非零状态码退出(通常表示失败),脚本立即终止执行
- -u(nounset) :访问未定义变量时立刻终止并报错
- -o pipefail :管道命令中有一个命令失败即为整体失败(默认退出状态码取决于管道最后一个命令)
- source [filename] :执行脚本,当前环境会继承执行脚本环境(环境变量,函数,别名等)
- 也可写为 . [filename]
- mapfile [options] [数组变量] < [stdin] :将指定内容读取为一个数组
- -t :从每一行末尾移除分隔符
- -d[分隔字符] :指定分隔字符(不再按行分隔,比如 -d, -d’’ 按逗号,空字符分隔)