Linux Shell 脚本基础002
1. 字符串运算符
字符串运算符用于对 Shell 中的字符串进行比较、判断操作,常用于脚本中验证字符串状态(如是否为空、是否相等),核心运算符及功能如下:
1.1 常见字符串运算符
=:判断两个字符串是否相等,格式为[ 字符串1 = 字符串2 ](注意空格,=两侧需保留空格),相等返回 “真”,不相等返回 “假”。
示例:
然后运行
- !=:判断两个字符串是否不相等,格式与=一致,不相等返回 “真”,相等返回 “假”。
- -z:判断字符串长度是否为 0(空字符串),格式为[ -z 字符串 ],为空返回 “真”,非空返回 “假”。
- -n:判断字符串长度是否不为 0(非空字符串),格式为[ -n 字符串 ],非空返回 “真”,为空返回 “假”。
2. 文件测试运算符
文件测试运算符用于检测 Linux 系统中文件的属性(如是否存在、是否为目录、是否可读写),是脚本中文件操作的核心判断依据,常用运算符及功能如下:
2.1 常见文件测试运算符
-e:检测文件或目录是否存在,存在返回 “真”,不存在返回 “假”,格式为[ -e 文件/目录路径 ]。
-d:检测路径是否为目录,是目录且存在返回 “真”,否则返回 “假”。
-f:检测路径是否为普通文件(非目录、非设备文件),是普通文件且存在返回 “真”,否则返回 “假”。
-r:检测文件是否可读(当前用户有读权限),可读且存在返回 “真”,否则返回 “假”。
-w:检测文件是否可写(当前用户有写权限),可写且存在返回 “真”,否则返回 “假”。
-x:检测文件是否可执行(当前用户有执行权限,如脚本、程序),可执行且存在返回 “真”,否则返回 “假”。
3. if 流程控制(单支,双支,多支)
if 流程控制用于根据条件判断结果执行不同的命令块,Shell 支持单支、双支、多支三种结构,满足不同场景的逻辑判断需求。
3.1 单支结构(if)
适用场景:仅当条件为 “真” 时执行命令块,条件为 “假” 时不执行(无后续操作)。
语法格式:
if [ 条件判断 ]; then
# 条件为真时执行的命令
fi # 结束if语句
示例:检测/home目录是否存在,存在则输出提示:
3.2 双支结构(if-else)
适用场景:条件为 “真” 时执行一个命令块,条件为 “假” 时执行另一个命令块(二选一)。
语法格式:
if [ 条件判断 ]; then
# 条件为真时执行的命令
else
# 条件为假时执行的命令
fi
示例:检测文件是否存在,存在则输出 “已存在”,不存在则创建文件:
然后执行命令查看结果
3.3 多支结构(if-elif-else)
适用场景:需要判断多个条件(依次判断),满足某个条件则执行对应命令块,所有条件都不满足则执行 else 块(多选一)。
语法格式:
f [ 条件1 ]; then
# 条件1为真时执行的命令
elif [ 条件2 ]; then
# 条件1为假、条件2为真时执行的命令
elif [ 条件3 ]; then
# 前两个条件为假、条件3为真时执行的命令
else
# 所有条件都为假时执行的命令
fi
示例:根据输入的分数判断等级(90 + 为优秀,80-89 为良好,60-79 为及格,<60 为不及格):
保存并运行
4. 标准文件描述符
在 Linux 中,每个打开的文件都会被分配一个 “文件描述符”(非负整数),用于标识文件。Shell 默认定义了 3 个标准文件描述符,对应系统默认的输入、输出设备:
4.1 三个核心标准文件描述符
- 0(STDIN,标准输入):对应 “标准输入设备”,默认是键盘,用于接收用户输入(如read命令读取的内容即来自 STDIN)。
- 1(STDOUT,标准输出):对应 “标准输出设备”,默认是终端(屏幕),用于输出命令执行的正常结果(如echo、ls命令的输出即输出到 STDOUT)。
- 2(STDERR,标准错误输出):对应 “标准错误输出设备”,默认也是终端(屏幕),用于输出命令执行的错误信息(如执行不存在的命令abc,报错信息即输出到 STDERR)。
这三个描述符的默认指向可通过 “重定向” 修改,实现 “输入从文件读取”“输出写入文件”“错误信息单独保存” 等功能。
5. 重定向(>,>>)
重定向用于修改标准输入、输出的默认指向,>和>>是最常用的 “标准输出重定向” 符号,用于将命令的正常输出写入文件(而非终端)。
5.1 覆盖重定向(>)
功能:将命令的标准输出(STDOUT)写入指定文件,若文件已存在,覆盖文件原有内容;若文件不存在,创建文件。
语法格式:命令 > 文件路径
示例:将ls -l命令的输出(当前目录文件列表)写入file_list.txt:
- 若file_list.txt已存在,原有内容会被ls -l的输出覆盖;若不存在,自动创建该文件。
- 执行后终端无输出(输出已被重定向到文件),可通过cat file_list.txt查看文件内容。
5.2 追加重定向(>>)
功能:将命令的标准输出(STDOUT)追加到指定文件末尾,若文件已存在,不覆盖原有内容,新内容添加在文件最后;若文件不存在,创建文件。
语法格式:命令 >> 文件路径
示例:将当前日期追加到log.txt文件:
- 多次执行该命令,每次的日期都会追加到log.txt末尾,不会覆盖之前的内容(适合记录日志)。
6. 重定向错误输出(2>,2>>)
2>和2>>用于重定向 “标准错误输出(STDERR,描述符 2)”,将命令执行的错误信息写入文件,避免错误信息混杂在正常输出中。
6.1 错误覆盖重定向(2>)
功能:将命令的错误输出(STDERR)写入指定文件,若文件已存在,覆盖原有内容;若文件不存在,创建文件。
语法格式:命令 2> 错误文件路径
示例:执行不存在的命令test_cmd,将错误信息写入error.log:
- 命令test_cmd不存在,报错信息会写入error.log,终端无错误输出。
- 若error.log已存在,原有内容会被覆盖。
6.2 错误追加重定向(2>>)
功能:将命令的错误输出(STDERR)追加到指定文件末尾,若文件已存在,不覆盖原有内容;若文件不存在,创建文件。
语法格式:命令 2>> 错误文件路径
- 两次命令的错误信息都会追加到error.log末尾,适合长期收集命令执行的错误日志。
7. 同时重定向 stdout 与 stderr
在实际脚本中,常需要将命令的 “正常输出(STDOUT)” 和 “错误输出(STDERR)” 同时重定向到同一个文件或不同文件,确保终端干净且日志完整。
7.1 重定向到同一个文件
方式 1(&> 或 >&):将 STDOUT(1)和 STDERR(2)同时重定向到同一个文件,覆盖原有内容。
语法格式: 命令 > 目标文件 2>&1 或 命令 &> 目标文件
示例:将ls -l /home /abc(/home存在,/abc不存在)的正常输出和错误输出同时写入all.log:
- ls -l /home的正常输出和ls -l /abc的错误输出都会写入all.log,覆盖原有内容。
8.将输出丢弃 (/dev/null)
