Shell 脚本是一种用于自动化执行命令的脚本语言,常用于 Linux 和 Unix 系统。以下是 Shell 脚本的基本语法详解:
1. 脚本文件基本结构
- Shebang(解释器声明) 脚本文件开头的第一行通常是 Shebang,它指定了脚本的解释器。常见的解释器有
/bin/bash
或/bin/sh
。
这行代码告诉系统使用#!/bin/bash
bash
来执行脚本。
2. 注释
注释是给脚本加上解释说明,便于后续维护和理解。
- 单行注释:使用
#
开头# 这是一个注释
3. 变量
3.1 定义变量
在 Shell 脚本中,定义变量时,变量名与赋值之间不能有空格:
name="John"
注意:不需要声明变量类型,所有变量默认是字符串。
3.2 使用变量
使用变量时要在变量名前加上 $
符号:
echo $name # 输出 John
3.3 变量的作用域
- 全局变量:在脚本中定义的变量,默认是全局的,除非在函数中有局部变量声明。
- 局部变量:可以使用
local
关键字在函数中声明局部变量,只在函数内部有效。my_function() {local name="Local Name"echo $name }
4. 特殊变量
$0
:脚本的文件名$1, $2, ...
:传递给脚本的参数$#
:传递给脚本的参数个数$@
:传递给脚本的所有参数(作为列表)$?
:上一个命令的返回状态(成功返回0,失败返回非0)$$
:当前脚本的进程ID$!
:最后运行的后台进程的进程ID
示例:
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "参数个数: $#"
5. 字符串操作
5.1 拼接字符串
可以通过简单的拼接来连接字符串:
greeting="Hello"
name="Alice"
message="$greeting, $name"
echo $message # 输出: Hello, Alice
5.2 字符串长度
使用 ${#变量名}
获取字符串长度:
string="Hello World"
echo ${#string} # 输出: 11
5.3 子字符串提取
使用 ${变量名:起始位置:长度}
提取子字符串:
string="Hello World"
echo ${string:0:5} # 输出: Hello
6. 运算符
6.1 算术运算
Shell 默认只处理字符串。如果需要进行算术运算,通常使用 expr
、let
或 (( ))
:
a=10
b=5
sum=$(expr $a + $b) # 使用 expr 进行加法
echo "Sum: $sum" # 输出: 15# 或者使用双括号
((sum = a + b))
echo "Sum: $sum" # 输出: 15
常见的算术运算符有:
+
:加法-
:减法*
:乘法/
:除法%
:取模
6.2 比较运算
比较运算用于数字比较,常见的比较运算符包括:
-eq
:等于-ne
:不等于-gt
:大于-lt
:小于-ge
:大于等于-le
:小于等于
示例:
a=10
b=20
if [ $a -eq $b ]; thenecho "a 等于 b"
elseecho "a 不等于 b"
fi
7. 条件判断
7.1 if 语句
if
语句的基本结构如下:
if [ 条件 ]; then# 条件为真时执行
elif [ 另一个条件 ]; then# 另一个条件为真时执行
else# 条件不成立时执行
fi
示例:
a=5
if [ $a -gt 10 ]; thenecho "a 大于 10"
elseecho "a 小于或等于 10"
fi
7.2 case 语句
case
语句用于多条件分支,类似于其他编程语言中的 switch
语句:
case "$variable" in"value1")echo "这是 value1";;"value2")echo "这是 value2";;*)echo "没有匹配的值";;
esac
8. 循环
8.1 for 循环
遍历列表中的每个元素:
for var in 1 2 3; doecho $var
done
8.2 while 循环
while
循环的基本结构是:
while [ 条件 ]; do# 执行的命令
done
9. 函数
在 Shell 脚本中,函数的定义和调用如下:
9.1 定义函数
function_name() {# 函数体
}
9.2 函数中的参数
Shell 函数可以通过 $1
, $2
等访问传递的参数,与脚本本身的参数传递方式类似。
$0
:脚本或函数的名称$1, $2, ...
:函数的参数$#
:传递给函数的参数个数$@
:传递给函数的所有参数
示例:
sum() {echo "第一个参数:$1"echo "第二个参数:$2"total=$(($1 + $2))echo "总和:$total"
}sum 5 10 # 输出:# 第一个参数:5# 第二个参数:10# 总和:15
9.3调用函数
直接使用函数名调用
示例:
greet() {echo "Hello, $1"
}greet "Tom" # 输出: Hello, Tom
9.4函数返回值
Shell 函数可以使用 return
语句返回整数值,该值通常用于表示函数的状态或结果(成功返回0,失败返回非0)。
示例:
is_even() {if [ $(($1 % 2)) -eq 0 ]; thenreturn 0 # 返回 0 表示成功elsereturn 1 # 返回 1 表示失败fi
}is_even 4
echo $? # 输出 0,表示 4 是偶数is_even 5
echo $? # 输出 1,表示 5 不是偶数
注意: return
只能返回整数,而不能直接返回字符串或复杂值。若需要返回字符串或其他复杂值,通常使用 echo
输出结果,然后在函数外部通过变量或命令替换捕获输出。
示例(返回字符串):
greet() {echo "Hello, $1"
}result=$(greet "Tom") # 使用命令替换捕获函数输出
echo $result # 输出: Hello, Tom
10. 输入和输出
10.1 读取输入
使用 read
命令从标准输入读取数据:
echo "请输入您的名字:"
read name
echo "Hello, $name"
10.2 重定向输出
将命令输出重定向到文件:
echo "Hello" > file.txt # 覆盖文件内容
echo "World" >> file.txt # 追加到文件末尾
10.3 管道
将一个命令的输出作为另一个命令的输入:
cat file.txt | grep "search_term"
总结
Shell 脚本的基本语法非常灵活,适合自动化处理各种系统任务。掌握变量、运算符、条件判断、循环、函数等基本语法后,可以编写出强大且高效的脚本。