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. 直接执行:包括:1、使用绝对路径/相对路径;2、将所在目录放在PATH环境变量中;(1、2两种需要为脚本文件加上rx权限)3、用bash/sh命令执行脚本。特点是在子进程的bash中执行,子进程结束后,变量或操作不会传回父进程。
  2. 利用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
2
3
4
5
6
7
if [ 条件判断式1 ]; then
程序段
elif [ 条件判断式2 ]; then
程序段
else
程序段
fi

多个条件判断式可以用&&或 || 连接,如 [ 条件判断式1 ] && [ 条件判断式2 ]

case语句

1
2
3
4
5
6
7
8
9
10
11
case ${变量名} in
"第1个变量内容")
程序段
;;
"第2个变量内容")
程序段
;;
*)
程序段
;;
esac

函数

1
2
3
function 函数名() {
函数体
}

函数体中可用$1、$2等代表参数1、参数2等

调用方式:函数名 参数1 参数2 …… 如:printit 1

循环语句

while语句

1
2
3
4
while [ 条件判断式 ]
do
程序段
done

until语句

1
2
3
4
until [ 条件判断式 ]
do
程序段
done

for语句

1
2
3
4
5
6
7
8
9
10
11
for var in con1 con2 ...
do
程序段
done

# 例子:
users=$(cut -d ':' -f1 /etc/passwd)
for username in ${users}
do
id ${username}
done

in后面的内容可以用 $(seq n1 n2) 或 {n1…n2} ,代表n1到n2的连续输字

1
2
3
4
for (( 初始值; 限制值; 赋值运算 ))
do
程序段
done

与C语言用法相同

脚本跟踪与调试

sh 调试shell脚本

语法:sh [-nx] 脚本名

选项

  • -n:不执行脚本,仅查询语法问题
  • -x:将执行过程显示出来,非常有用,可用于调试

Linux笔记-shell脚本语法
https://leo.zz.ac/posts/827c.html
作者
AquariusLeo
发布于
2025年9月7日
更新于
2025年9月22日
许可协议