Linux Shell 脚本基础002

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)

含义:把不想要的输出重定向到 /dev/null (黑洞)。
示例:将ls -l /home /abc(/home存在,/abc不存在)的正常输出丢弃,错误输出保留

相关推荐
czhc11400756638 小时前
Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
linux·运维·r语言
滴滴滴嘟嘟嘟.8 小时前
嵌入式Linux驱动开发:蜂鸣器驱动
linux·运维·驱动开发
hit56实验室9 小时前
腾讯云的运维笔记——从yum的安装与更新源开始
运维·笔记·腾讯云
梅见十柒9 小时前
UNIX网络编程笔记:共享内存区和远程过程调用
linux·服务器·网络·笔记·tcp/ip·udp·unix
成都极云科技10 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
溯光笔记10 小时前
服务器内网穿透NPS搭建过程 - 服务端linux服务器 客户端windows系统 - 溯光笔记
linux·服务器·windows
2501_9301247010 小时前
Linux之Shell编程(三)流程控制
linux·前端·chrome
我命由我1234511 小时前
Word - Word 查找文本中的特定内容
运维·经验分享·笔记·word·运维开发·文档·文本
IDC02_FEIYA11 小时前
服务器托管多少钱一年?服务器托管收费标准
运维·服务器
Sadsvit12 小时前
Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
linux·运维·centos·自动化·ansible