Shell VI Shell编程

Shell-VI-Shell编程.md

什么是Shell编程?

Shell 编程是一种基于 Shell 解释器语法规则,结合环境变量和命令行参数,通过组织和控制系统命令以实现自动化任务与进程管理的脚本语言。

变量

tips

父进程的变量在子进程中不可见,需要使用export声明需要的变量或者使用 . child.sh 执行

shell中声明变量赋值变量名必须严格紧贴赋值符合“=”

基础变量

Shell(bash)本身提供了一些基础变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$?                      #储存了上一次的执行结果,用于对步骤执行结果的判断
$1-$9 #储存了传入的位置参数
$# #传递的参数个数
$@ #传递的所有参数
$* #传递的所有参数 ,作为一个整体
$$ #进程的pid
$! #上一个后台命令的pid
$_ #上一个命令的最后一个参数
$IFS #输入字段分隔符(默认是空格、Tab、换行)
$RANDOM #生成一个0~32767 的随机数
$LINENO #当前脚本中的行号
$UID / $EUID #当前用户的 UID(真实/有效)
$PWD #当前目录
$HOME #当前用户的主目录
$PATH #系统查找命令的路径列表
$SHELL #当前默认的 shell 路径

通过使用上述的变量,编写第一个shell脚本

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
read -p "Give me a name: " name
echo hello $name
echo your home path is $HOME
echo current dir is $PWD

Give me a name: Codfish
hello Codfish
your home path is /root
current dir is /home/codfish/my_bash

变量

1
2
3
4
5
6
7
name="Alice"              # 普通变量(默认是字符串)
declare -i age=18 # 整数变量
readonly pi=3.14 # 只读变量
export PATH=$PATH:/new # 环境变量
arr=(apple banana cherry) # 数组变量
declare -A user # 关联数组(Bash 4+)
user[id]=001

引用和执行

`` ,’’,”“,以及$(())

以上都可以作为字符串向shell脚本中的变量赋值。

反引号 : 获取命令执行后的结果作为变量的值(过时)

1
2
3
4
hi="hello"
hi1=`echo hello`

result : hello

单引号‘’ : 输出字符串,完全不解析

1
2
3
4
5

hi2='echo $hi'
echo $hi2

result : echo $hi1

双引号‘’ : 输出含变量空格信息

1
2
3
4
hi3="echo $hi"
echo $hi3

result : echo hello

$()’ : 获取命令执行后的结果作为变量的值,支持嵌套

1
2
3
4
hi4=$(echo $hi)
echo $hi4

result : hello

运算符

算术运算

1
2
3
4
5
6
7
8
+	   #加法
- #减法
* #乘法
/ #除法(整数除法)
% #取余
++ #自增(前/后都支持)
-- #自减
** #幂运算(Bash 4.0+ 支持)

整数比较运算

1
2
3
4
5
6
-eq	 #等于
-ne #不等于
-gt #大于
-lt #小于
-ge #大于等于
-le #小于等于

字符比较运算

1
2
3
4
5
6
= 或 ==	 #字符串相等
!= #字符串不等
< #字典序小于(仅 [[ ]])
> #字典序大于(仅 [[ ]])
-z #字符串为空
-n #字符串非空

逻辑运算符

1
2
3
4
5
6
7
用于 []
-a #AND(与)
-o #OR(或)
用于 [[]] 或(())
&& #与
`
! #非(取反)

文件测试运算符

1
2
3
4
5
6
7
8
9
10
-e	            #文件存在
-f #是普通文件
-d #是目录
-L #是符号链接
-r #有读权限
-w #有写权限
-x #有执行权限
-s #文件非空
file1 -nt file2 #file1 比 file2 新
file1 -ot file2 #file1 比 file2 旧

位运算符

1
2
3
4
5
&	             #按位与
^ #按位异或
~ #按位取反
<< #左移
>> #右移

赋值运算

1
2
3
4
5
6
7
8
9
10
=	             #赋值
+= #加后赋值
-= #减后赋值
*= #乘后赋值
/= #除后赋值
%= #取余后赋值
<<= #左移后赋值
>>= #右移后赋值
&= #位与赋值
^= #位异或赋值
整数判断/运算 (( ))
字符串判断 [[ ]] (或 [ ]
文件测试 [ ]
组合条件(逻辑与或) [[ ]]

循环控制

tips

变量不能紧贴判断符号[ ]

判断语句

if 语句

1
2
3
4
5
6
7
if [ condition1 ]; then
# condition1为真执行
elif [condition2]; then
# condition2为真执行
else
# 条件均不满足时执行
fi

switch语句

1
2
3
4
5
6
7
8
9
10
11
case $变量 in
模式1)
命令1
;;
模式2)
命令2
;;
*)
默认命令
;;
esac

循环语句

for语句

1
2
3
for var in val1 val2 val3; do
# 循环体
done
1
2
3
for ((i=0; i<5; i++)); do
echo $i
done

while语句

1
2
3
while [ 条件 ]; do
# 循环体
done

until语句

1
2
3
until [ 条件 ]; do
# 循环体
done

break 中断并跳出当前循环

continue 跳过本次循环执行下一次循环

函数

函数声明

1
2
3
4
function myfunc {
echo "Hello from myfunc"
}

1
2
3
myfunc() {
echo "Hello from myfunc"
}

参数传入

Shell 函数不需要事先声明类型,调用时直接以空格分隔传递参数,函数内部用 $1、$2 等方式访问。

1
2
3
4
5
6
greet() {
echo "Hello, $1!"
}

greet "Alice" # 输出:Hello, Alice!

返回值

return 用于返回状态码(0~255),而 echo 用于将值输出给命令替换($(...))来接收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
check_even() {
if [ $(( $1 % 2 )) -eq 0 ]; then
return 0
else
return 1
fi
}

check_even 4
echo $?
# 或者 接收echo的输出
check_even2() {
if [ $(( $1 % 2 )) -eq 0 ]; then
echo "even"
else
echo "odd"
fi
}

res=$(check_even2 5)
echo $res

局部变量

1
2
3
4
5
6
7
8
# 允许定义局部变量
myfunc() {
local var="secret"
echo "Inside: $var"
}
myfunc
echo "Outside: $var" # var 不存在


Shell VI Shell编程
http://gadoid.io/2025/04/09/Shell-VI-Shell编程/
作者
Codfish
发布于
2025年4月9日
许可协议