Linux笔记-shell脚本语法
本文最后更新于 2025年9月22日 凌晨
“Linux笔记”系列博客是在阅读学习《鸟叔的LINUX私房菜》书籍时形成的思维导图,将其整理为笔记形式。包含以下部分:
shell脚本语法
Shell脚本与Windows/Dos下的批处理相似,也就是用各类shell命令预先放入到一个文本文件中,方便一次性执行。也能提供条件判断、循环、函数等语法功能。可用于便利地执行一系列复杂命令、周期性或重复性执行命令,能简化Linux日常操作、运维。
编写Shell脚本,可以使用几乎所有的可在Linux命令行中执行的命令,以及 Linux笔记-常用命令-Shell与文本处理 中的知识(包括变量、通配符、特殊符号、数据流重定向、管道命令等)。速查表见 Bash/Shell/Linux速查表 。
脚本开头要写的内容
- #!/bin/bash 或 #!/bin/bash
- 脚本的功能、作者、版本信息等
- 预先设置环境变量
变量相关规则
- 设置变量时用等号连接,如:myname=vbird
- 引用变量的方式:${变量名} 或 $变量名(可能引起歧义的情况下尽量使用花括号)
- 输出变量内容:echo ${变量名}
- 变量名不能以数字开头
- 等号两边不能直接出现空格,如:myname=vbird as是错的
- 变量内容若有空格可用单引号或双引号,双引号中的特殊字符保留原本功能,单引号中的特殊字符仅为一般字符,如var=”lang is $LANG”,$LANG替换为变量内容
- 可用反斜杠\将特殊字符( [Enter]、$、\、空格、’ )转义为一般字符,如:myname=vbird\ tsai
- 若要扩增变量内容,可以如:PATH=”$PATH”:/home/bin 或 PATH=${PATH}:/home/bin
- 若要获得额外的命令所提供的信息进行替换时,可用 $(命令) ,如:version=$(uname -r)
- 可使用unset取消变量,如:unset myname
- 变量的数值计算,用$((运算式)),如 total=$(( ${firstnu}*${secnu} )),但bash中数值计算最多只能到整数
- 变量的默认类型为字符串,若要定义整数:declare -i num=12,定义数组:declare -a array=(a b c d)
脚本执行的两种方式
- 直接执行:包括:1、使用绝对路径/相对路径;2、将所在目录放在PATH环境变量中;(1、2两种需要为脚本文件加上rx权限)3、用bash/sh命令执行脚本。特点是在子进程的bash中执行,子进程结束后,变量或操作不会传回父进程。
- 利用source:用法是source 脚本名,特点是在父进程中执行,各项操作会在原bash中生效
test命令的测试功能
语法:test 选项 文件名/变量/字符串……
test命令没有输出,当测试成功,命令返回值 $? 变量为0,失败则为非0。因此可以结合&&、|| 使用。
选项
- -e:文件名是否存在
- -f:文件名是否存在且为文件
- -d:文件名是否存在且为目录
- n1 -eq n2:两数值相等(不等使用-ne)
- n1 -gt n2:n1大于n2(小于使用-lt)
- -z string:字符串是否为空
- str1 = str2 (若使用判断符号,必须写为[ str1 = str2 ] 或者 [[ str1 == str2 ]])(关于 [] 与 [[]] 的区别可参考博客)
- str1 != str2
- -a 且 -o 或 !非
更多选项及用法如文件类型、权限检测、文件比较、整数比较、字符串判定、多重条件判定等,见私房菜P396
常结合命令执行的判断依据&&、|| 使用,如:test -e filename && echo “Exist” || echo “Not exist”
判断符号[ ]
用法与test相同,如 [ -e filename ] 等价于 test -e filename,也可与&&、|| 结合使用
注意中括号内的每一个组件之间都要有空格分隔,每一个变量或常量都要有双引号
默认变量
- $0:脚本文件名
- $1、$2等:依次为各个参数
- $#:输入的参数个数
- $@:所有参数,代表【”$1” “$2” “$3” …】,以空格隔开
基本语句
条件语句
1 | |
多个条件判断式可以用&&或 || 连接,如 [ 条件判断式1 ] && [ 条件判断式2 ]
case语句
1 | |
函数
1 | |
函数体中可用$1、$2等代表参数1、参数2等
调用方式:函数名 参数1 参数2 …… 如:printit 1
循环语句
while语句
1 | |
until语句
1 | |
for语句
1 | |
in后面的内容可以用 $(seq n1 n2) 或 {n1…n2} ,代表n1到n2的连续输字
1 | |
与C语言用法相同
脚本跟踪与调试
sh 调试shell脚本
语法:sh [-nx] 脚本名
选项
- -n:不执行脚本,仅查询语法问题
- -x:将执行过程显示出来,非常有用,可用于调试