一、Shell脚本入门

1、脚本格式

脚本以#!/bin/bash 开头(指定解析器)

2、编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
[root@yxl100 ~]#  mkdir scripts
[root@yxl100 ~]# ls
anaconda-ks.cfg myinfo.zip 视频 音乐
google-chrome-stable_current_x86_64.rpm scripts 图片 桌面
info 公共 文档
initial-setup-ks.cfg 模板 下载
[root@yxl100 ~]# cd scripts/
[root@yxl100 scripts]# ls
[root@yxl100 scripts]# touch hello.sh
[root@yxl100 scripts]# ls
hello.sh
[root@yxl100 scripts]# vim hello.sh
1
2
#!/bin/bash
echo "hello,world"

3、运行脚本

(1)没改权限之前

1
2
3
4
[root@yxl100 scripts]# sh ./hello.sh
hello,world
[root@yxl100 scripts]# bash hello.sh
hello,world

(2)修改权限之后

1
2
3
4
5
6
7
8
9
10
11
12
[root@yxl100 scripts]# chmod +x hello.sh
[root@yxl100 scripts]# ls
hello.sh
[root@yxl100 scripts]# ./hello.sh
hello,world
[root@yxl100 scripts]# cd
[root@yxl100 ~]# scripts/hello.sh
hello,world
[root@yxl100 scripts]# source hello.sh
hello,world
[root@yxl100 scripts]# . hello.sh
hello,world

二、变量

1、系统变量

变量 描述 示例
$HOME 当前用户的主目录路径 /home/username
$USER 当前用户的用户名 username
$PATH 可执行文件的搜索路径 /usr/local/bin:/usr/bin
$SHELL 当前Shell的路径 /bin/bash
$PWD 当前工作目录的路径 /home/username/projects
$OLDPWD 上一次工作目录的路径 /home/username
$HOSTNAME 当前主机的名称 my-computer
$LANG 当前语言设置 en_US.UTF-8
$0 当前脚本的名称或路径 script.sh./script.sh
$1$9 脚本接收的第1到第9个参数
$# 传递给脚本的参数个数 3
$* 传递给脚本的所有参数作为一个字符串 "arg1 arg2 arg3"
$$$$ 当前Shell进程的PID 12345
$? 上一个命令的退出状态 0 表示成功,非0表示失败
$@ 传递给脚本的所有参数,每个参数独立显示 "arg1" "arg2" "arg3"

2、自定义变量

操作/规则 命令/说明 示例
定义变量 变量名=变量值 A=5
打印变量 使用 $ 符号引用变量值 echo $A 输出 5
撤销变量 使用 unset 命令撤销变量 unset A
声明静态变量 使用 readonly 命令声明静态变量,不能修改和撤销 readonly B=2
空格处理 如果变量的值中有空格,需要使用双引号或单引号括起来 D="I love banzhang"
变量默认类型 Bash 中变量默认是字符串类型,无法直接进行数值运算 C=1+2 echo $C 输出 1+2
变量名称 变量名称可由字母、数字和下划线组成,但不能以数字开头。环境变量名建议大写 例如:MY_VAR=10
等号两侧不能有空格 赋值时等号两侧不能有空格 正确:A=5,错误:A = 5
全局环境变量 使用 export 命令将变量提升为全局环境变量 export B

三、运算符

操作/语法 说明 示例
算术运算符 进行整数运算 + - * / % ++ --
使用 $((运算式)) 计算并返回运算结果 result=$((2 + 3))
使用 $[运算式] 计算并返回运算结果 result=$[2 + 3]
变量与运算结合 可以将变量与算术表达式结合使用 a=5; result=$((a * 2))
嵌套运算 支持嵌套运算 result=$(( (2 + 3) * 4 ))
注意事项 运算符之间需要有空格,以确保正确解析 正确:result=$(( 2 + 3 ))
1
2
3
4
5
6
7
8
9
10
[root@yxl100 scripts]# echo $[1+2]
3
[root@yxl100 scripts]# a=$[1+2]
[root@yxl100 scripts]# echo $a
3
[root@yxl100 scripts]# b=$[(2+3)*4]
[root@yxl100 scripts]# echo $b
20
[root@yxl100 scripts]# echo $[$a+$b]
23

四、条件判断

操作/语法 说明 示例
基本语法
test condition 使用 test 命令进行条件判断 test 5 -eq 5
[ condition ] 使用 [] 进行条件判断,condition 前后需有空格 [ 5 -eq 5 ]
整数比较 使用算术运算符进行整数比较
-eq 等于(equal) [ 5 -eq 5 ]
-ne 不等于(not equal) [ 5 -ne 3 ]
-lt 小于(less than) [ 3 -lt 5 ]
-le 小于等于(less equal) [ 5 -le 5 ]
-gt 大于(greater than) [ 5 -gt 3 ]
-ge 大于等于(greater equal) [ 5 -ge 5 ]
字符串比较 字符串之间的相等或不等比较
= 判断字符串是否相等 [ "abc" = "abc" ]
!= 判断字符串是否不等 [ "abc" != "def" ]
文件权限判断 根据文件权限进行判断
-r 是否具有读权限(read) [ -r filename ]
-w 是否具有写权限(write) [ -w filename ]
-x 是否具有执行权限(execute) [ -x filename ]
文件类型判断 根据文件类型进行判断
-e 文件是否存在(existence) [ -e 路径 ]
-f 文件是否存在且是一个常规文件(file) [ -f 路径 ]
-d 文件是否存在且是一个目录(directory) [ -d 路径 ]
多条件判断 使用逻辑运算符进行多条件判断
&& 逻辑与:前一条命令执行成功时,才执行后一条命令 [ 5 -eq 5 ] && echo OK
|| 逻辑或:前一条命令执行失败时,才执行后一条命令 [ 5 -ne 5 ] || echo notOK

五、流程控制

结构/语法 说明 示例
if 判断 根据条件判断执行不同的程序块
单分支 if 语句 单个条件判断,条件成立时执行程序块 if [ $1 -eq 1 ]; then echo "True"; fi
多分支 if 语句 多个条件判断,依次执行相应程序块 if [ $1 -eq 1 ]; then echo "1"; elif [ $1 -eq 2 ]; then echo "2"; else echo "Other"; fi
注意事项 - [ 条件判断式 ] 中括号和条件之间必须有空格
- if 后要有空格
case 语句 根据变量的值执行不同的程序块
基本语法 使用模式匹配执行不同的命令序列 case $1 in "1") echo "One";; "2") echo "Two";; *) echo "Other";; esac
注意事项 - case 语句以 in 结尾,每个模式匹配以 ) 结束
- 双分号 ;; 表示命令序列结束
for 循环 循环执行一组命令
for (( 初始值;条件;变量变化 )) 经典 for 循环语法 for ((i=0; i<=100; i++)); do sum=$((sum+i)); done
for 变量 in 值1 值2… 迭代循环一组值 for i in 1 2 3; do echo "Value $i"; done
while 循环 当条件为真时循环执行命令
基本语法 使用条件判断执行循环 while [ $i -le 100 ]; do sum=$((sum+i)); i=$((i+1)); done

六、输入输出

命令/操作 说明 示例 选项
read 从控制台读取输入,并将其存储在指定变量中 read name
read -p "Enter your name: " name
-p:提示文本
-t:设置超时时间(秒)
-n:限制输入字符数
-s:隐藏输入
echo 输出文本到终端或文件,通常用于提示或显示变量内容 echo "Hello, $name"
echo "This is a test" > output.txt
-n:不换行
-e:启用转义字符
-E:禁用转义字符(默认行为)
输入重定向 (<) 从文件而不是终端读取输入 read name < input.txt
输出重定向 (>) 将输出写入文件而不是显示在终端,覆盖文件内容 echo "Hello" > output.txt
追加重定向 (>>) 将输出追加到文件末尾而不是覆盖文件 echo "Append this" >> output.txt
printf 格式化文本输出,比 echo 更灵活,可控制输出格式 printf "Name: %s\n" "$name" -v var:将输出保存到变量 var 而不是输出到屏幕
cat 显示文件内容,或从终端/文件中读取输入并显示或重定向到文件 cat file.txt
cat < input.txt > output.txt
-n:显示行号
-E:显示行尾的 $ 符号
-T:显示制表符为 ^I
管道 (|) 将一个命令的输出作为另一个命令的输入 echo “Hello” | read var
tee 从标准输入读取数据,将其输出到标准输出和文件 echo “Hello” | tee output.txt -a:追加到文件而不是覆盖
-i:忽略中断信号
>2> 分别用于重定向标准输出和标准错误输出 command > output.txt 2> error.log
&> 将标准输出和标准错误输出同时重定向到同一文件 command &> all_output.txt
> 和 |& 分别用于将标准输出重定向到文件、将标准输出和错误管道到另一个命令 command > file.txt
command |& grep “error”

七、函数

1、系统函数

系统函数 功能描述 基本语法 案例 选项 补充
basename 删除路径中的所有前缀,包括最后一个斜杠 /,返回文件名部分 basename [string / pathname] [suffix] basename /home/yxl/banzhang.txt
basename /home/yxl/banzhang.txt .txt
suffix:可选参数,指定后会从返回的文件名中去除该后缀 如果路径以 / 结尾,返回空字符串
常与 find 命令结合使用,批量提取文件名
dirname 删除路径中的文件名部分,返回目录路径 dirname 文件绝对路径 dirname /home/yxl/banzhang.txt 对于根路径 /dirname / 返回 /

2、自定义函数

结构/语法 说明 示例 选项 补充
自定义函数 自定义函数用于在脚本中封装可重复使用的代码块 函数定义必须在调用之前
函数没有参数时,可以省略括号
基本语法 定义一个自定义函数,并可选择性地返回一个整数值 [ function ] funname[()] { Action; [return int;] } return 用于指定返回值 return 后只能返回 0-255 的整数值
如果未指定 return,函数的返回值为最后一个命令的执行结果
调用函数 通过函数名调用自定义函数,并可以传递参数 funname arg1 arg2 调用函数时,传递的参数通过 $1, $2 等特殊变量访问
函数返回值 函数返回值通过 $? 系统变量获取 result=$? 函数返回值只能是整数
通常用于表示成功或失败
案例:计算两个数的和 创建一个自定义函数 sum,用于计算两个输入参数的和 bash<br>function sum() {<br>s=$[$1+$2];<br>echo "$s";<br>}<br>read -p "Please input the number1: " n1;<br>read -p "Please input the number2: " n2;<br>sum $n1 $n2; read -p 用于读取用户输入并提示输入信息 自定义函数可以包含任何有效的 Shell 命令
函数内部的变量是全局的,如果需要局部变量,请使用 local