Shell脚本
编程语言分类
编译型语言
- 需将源代码编译成可执行文件才能运行
- 示例:C、C++、C#、Java
- 特点:全部代码无语法错误才能编译运行
解释型语言
- 无需编译,直接逐行解释执行
- 示例:JavaScript、TypeScript、Python、Shell
- 特点:逐行执行,即使后续语句有错,前面正确语句仍可运行
Shell解析器
/bin/bash/bin/sh
编写脚本时需在文件首行指定解析器:
#!/bin/bash
Shell脚本文件
- 扩展名:
.sh - 简单示例:shell
#!/bin/bash # 这是注释行 echo "hello shell" # 输出文本到终端
运行Shell脚本
- 方法:
./脚本名.sh
注意:
- 脚本需有可执行权限:
chmod +x 脚本名.sh- 编辑时需使用Unix(LF)换行模式(推荐用vim编辑)
Shell变量
变量定义与使用
- 定义:
变量名=值(等号两侧不能有空格)shellNUM=123 # 定义变量 - 引用:shell
echo $NUM # 输出变量值 echo ${NUM} # 推荐写法
变量类型
自定义变量
- 用户自定义的变量shell
LS=`ls` # 反引号执行命令并赋值
位置变量
| 变量 | 含义 |
|---|---|
$0 | 脚本名称(如 ./demo.sh) |
$1 | 第一个参数 |
$2 | 第二个参数 |
| ... | ...(最多支持9个参数) |
$# | 参数个数(不含$0) |
$@ | 所有参数列表(独立字符串) |
$* | 所有参数合并为单个字符串 |
$? | 上条命令退出码(0-255) |
环境变量
- 系统预定义变量shell
echo $PATH # 可执行文件搜索路径 echo $HOME # 当前用户家目录 export # 查看所有环境变量
数组
- 定义:
数组名=(值1 值2 值3)shellArray=(1 2 3 4) - 操作:shell
echo ${Array[0]} # 访问下标0 Array[1]=100 # 修改下标1的值 echo ${Array[*]} # 输出所有元素
注意:
- 元素用空格分隔,下标可不连续(空缺位置为空)
- 下标从0开始
Shell语句
输入语句
- read:从终端读取数据shell常用参数:
read NUM1 NUM2 # 读取两个数据参数 功能 -p显示提示符( read -p "提示" var)-s静默输入(不显示内容) -t超时时间(秒) -a读取到数组( read -a arr)
输入重定向
- 从文件读取而非键盘shell
read name < input.txt # 从文件读取一行
输出语句
- echo:输出内容到终端shell
echo "Hello World"
输出重定向
| 符号 | 功能 |
|---|---|
> | 覆盖写入文件 |
>> | 追加写入文件 |
2> | 错误输出重定向 |
shell
echo "内容" > output.log # 覆盖写入
echo "追加" >> output.log # 追加写入算术运算
- expr:整数运算命令shell
expr 1 + 2 # 输出3 SUM=`expr 1 \* 2` # 乘法需转义*
注意:运算符两侧必须有空格
测试语句(test)
字符串测试
| 测试条件 | 含义 | 示例 |
|---|---|---|
"str1" = "str2" | 字符串相等 | test "abc" = "abc" |
"str1" != "str2" | 字符串不等 | test "a" != "b" |
-z "str" | 字符串为空(长度0) | test -z "" |
-n "str" | 字符串非空 | test -n "abc" |
整数测试
| 测试条件 | 含义 | 示例 |
|---|---|---|
num1 -eq num2 | 相等 | test 123 -eq 123 |
num1 -ne num2 | 不等 | test 123 -ne 456 |
num1 -gt num2 | 大于 | test 100 -gt 50 |
num1 -lt num2 | 小于 | test 50 -lt 100 |
num1 -ge num2 | 大于等于 | test 100 -ge 100 |
num1 -le num2 | 小于等于 | test 50 -le 100 |
文件测试
| 测试条件 | 含义 | 示例 |
|---|---|---|
-d 文件 | 是否为目录 | test -d /home |
-f 文件 | 是否为普通文件 | test -f test.txt |
-L 文件 | 是否为链接文件 | test -L symlink |
-r 文件 | 是否可读 | test -r file |
-w 文件 | 是否可写 | test -w file |
-x 文件 | 是否可执行 | test -x script.sh |
-s 文件 | 文件是否非空 | test -s data.log |
file1 -nt file2 | file1是否比file2新 | test a.txt -nt b.txt |
file1 -ot file2 | file1是否比file2旧 | test a.txt -ot b.txt |
简写:可用
[ ]替代test(两侧需留空格)shell[ -f "test.txt" ] # 等价于 test -f test.txt
结构性语句
分支语句
if分支
shell
if [ 条件 ]
then
# 条件成立执行
elif [ 条件2 ]
then
# 条件2成立执行
else
# 其他情况执行
fi示例:
shell
if [ -f "$filename" ]
then
echo "$filename 是普通文件"
else
echo "$filename 不是普通文件"
ficase分支
shell
case $变量 in
模式1)
语句块1
;; # 必须双分号结尾
模式2)
语句块2
;;
*) # 默认匹配
默认语句块
;;
esac通配符:
*:匹配任意字符?:匹配单个字符
shell
case $file in
*.txt)
echo "文本文件"
;;
*.sh)
echo "脚本文件"
;;
*)
echo "未知文件"
;;
esac循环语句
for循环
shell
# 列表形式
for var in 值1 值2 值3
do
echo $var
done
# C语言形式
for ((i=0; i<10; i++))
do
echo $i
donewhile循环
shell
while [ 条件 ]
do
# 循环体
done示例:
shell
num=0
while [ $num -le 10 ]
do
echo $num
num=`expr $num + 1` # 数值递增
done控制语句:
break:跳出循环continue:跳过本次循环
Shell函数
shell
函数名() {
函数体
return 返回值 # 可选
}特点:
- 无参数列表(使用位置变量
$1, $2...传参) - 无返回值类型(通过
return返回整数,或直接输出结果) - 无作用域限制(可访问脚本全局变量)
示例:
shell
sum() {
s=`expr $1 + $2`
echo $s # 输出结果
# 或 return $s (返回值范围0-255)
}
# 调用
result=$(sum 10 20)
echo "结果为:$result"作业
- 编写脚本生成C++文件模板:
shell
#!/bin/bash
if [ $# -eq 0 ]; then
echo "请提供文件名"
exit 1
fi
cat > $1.cpp << EOF
#include <iostream>
using namespace std;
int main() {
// 代码
return 0;
}
EOF
echo "已创建 $1.cpp"
2. 实现简单计算器:
```shell
#!/bin/bash
if [ $# -ne 3 ]; then
echo "用法: 计算器 操作数1 运算符 操作数2"
exit 1
fi
case $2 in
+) echo $(($1 + $3)) ;;
-) echo $(($1 - $3)) ;;
*) echo $(($1 * $3)) ;; # 仅支持加减乘
/) echo "除法需特殊处理" ;;
esac