shell脚本
第一部分:shell的概述
1. shell定义
- Shell是脚本文件,用于批处理任务。
- Shell既是软件也是语言:
- 作为软件,是命令解析器(如sh, ash, bash),负责逐行解析执行脚本。
- 作为语言,是shell脚本语言,必须符合解析器的规则。
2. 系统默认脚本文件
/etc/profile
:对所有用户有效,登录系统时执行。~/.bashrc
:对登录的用户有效,登录或打开终端时执行。
3. 编写脚本的步骤
- 指明脚本解析器,如
#!/bin/bash
。 - 编写脚本内容。
- 给脚本文件增加可执行权限:
chmod +x 脚本文件
。 - 执行脚本文件,可通过以下方式:
./00_shell.sh
:使用#!指定的shell执行。. 00_shell.sh
:使用当前shell读取解释。bash 00_shell.sh
:指定bash解释执行。
第二部分:shell的自定义变量
1. 定义变量
- 变量名由字母、数字、下划线组成,不能以数字开头,不能是关键字。
2. 获取键盘输入
- 使用
read
命令获取用户输入。
3. 只读变量
- 使用
readonly
关键字定义只读变量。
4. 导出环境变量
- 使用
export
关键字将脚本变量导出为环境变量。
5. 变量的注意事项
- 等号两边不能有空格。
- 如果变量包含空格,需要用双引号或单引号括起来。
6. 修改变量值
- 如给
PATH
添加路径:export PATH=~/tool/opencv:$PATH
。
第三部分:shell的预设变量
$#
:传递给脚本的参数数量。$*
:传递给脚本的参数内容。$1, $2, ...
:脚本运行时传递的参数。$?
:命令执行后的返回状态。$0
:当前执行的进程名。$$
:当前进程的进程号。
第四部分:Shell脚本的特殊用法
4.1 引号的使用
- 双引号(
""
):包含的变量会被解析扩展为它们的值。如果变量不存在,通常为空字符串。echo "Hello, $USER!" # 解析为当前用户的用户名
- 单引号(
''
):包含的变量不会被解析,被视为普通字符串。echo 'Hello, $USER!' # 输出字符串 "Hello, $USER!"
4.2 反引号
- 用于执行命令并捕获其输出。
today=`date` # 获取当前日期并赋值给变量today echo "Today is $today"
4.3 转义字符
- 用于指定特殊字符或转义其他特殊字符。
echo -e "\t \r \n" # 打印制表符、回车符、换行符
4.4 命令组
- 圆括号
(command1 && command2)
:如果command1
成功(返回0),则执行command2
。 - 花括号
{ command; }
:在当前shell中执行命令,影响当前shell的变量。
第五部分:条件测试
5.1 条件测试概述
- 使用
test
或[ ]
进行条件测试,用以判断某个条件是否为真。
5.2 文件测试
- 测试文件是否存在、类型、权限等。
-e file.txt # 文件是否存在 -d dir # 是否为目录 -r file.txt # 文件是否可读
5.3 字符串测试
- 测试字符串是否相等、是否为空。
[ "$str1" = "$str2" ] # 比较两个字符串是否相等 [ -z "$str" ] # 字符串是否为空
5.4 字符串操作扩展
- 字符串操作可以包括长度测试、子字符串测试等。
5.5 数值测试
- 测试数值是否相等、大小关系等。
[ 1 -eq 1 ] # 数值是否相等 [ 2 -gt 1 ] # 数值是否大于
5.6 数值的扩展
- 可以进行更复杂的数值比较和运算。
5.7 复合测试
- 使用逻辑运算符进行复合条件测试。
[ $a -gt 10 -a $b -lt 20 ] # 逻辑与 [ $a -lt 10 -o $b -gt 20 ] # 逻辑或
第六部分:控制语句
6.1 if控制语句
- 用于基于条件执行不同的程序段。
if [ condition ]; then # 条件为真时执行的代码 elif [ another_condition ]; then # 另一个条件为真时执行的代码 else # 所有条件都不满足时执行的代码 fi
6.2 case控制语句
- 用于多条件分支选择。
case $variable in pattern1) # 当变量匹配pattern1时执行的代码 ;; pattern2) # 当变量匹配pattern2时执行的代码 ;; *) # 默认执行的代码 ;; esac
6.3 for循环语句
- 遍历列表或数值范围执行循环。
for var in list do # 使用$var执行的代码 done
6.4 while循环语句
- 当条件为真时循环执行代码块。
while [ condition ] do # 条件为真时执行的代码 done
6.5 until循环语句
- 与while循环相反,当条件为真时退出循环。
until [ condition ] do # 条件不满足时执行的代码 done
第七部分:函数
7.1 函数定义
- 将一组命令或语句集封装成可重用的块。
function_name() { # 函数体 }
7.2 函数案例
- 案例1:封装计算两个数的和。
add() { echo $(( $1 + $2 )) }
- 案例2:函数分文件,将函数定义在单独文件中,通过source命令引入。
练习案例
编写脚本执行以下任务:
- 检查用户家目录下是否存在名为
test
的文件夹。 - 如果不存在,提示用户是否创建该文件夹,并在用户确认后创建并进入。
- 如果存在,提示用户输入字符串,并按此字符串创建一个文件。
- 如果文件已存在,提示用户重新输入,重复三次后自动退出。
- 如果文件不存在,创建文件并退出。
脚本示例:
#!/bin/bash
read -p "请输入文件夹名:" folder_name
if [ ! -d ~/$folder_name ]; then
read -p "文件夹不存在,是否创建?(y/n): " answer
if [[ $answer == [yY] ]]; then
mkdir ~/$folder_name
cd ~/$folder_name
else
echo "退出脚本。"
exit 1
fi
else
cd ~/$folder_name
read -p "请输入文件名:" file_name
count=0
while [ $count -lt 3 ]; do
if [ -e $file_name ]; then
echo "文件已存在,请重新输入。"
read -p "新的文件名:" file_name
((count++))
else
touch $file_name
echo "文件创建成功。"
break
fi
done
if [ $count -eq 3 ]; then
echo "已尝试三次,退出脚本。"
exit 1
fi
fi