Linux Shell 脚本基础002

发布于:2025-08-30 ⋅ 阅读:(15) ⋅ 点赞:(0)

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,标准输出):对应 “标准输出设备”,默认是终端(屏幕),用于输出命令执行的正常结果(如echols命令的输出即输出到 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不存在)的正常输出丢弃,错误输出保留


网站公告

今日签到

点亮在社区的每一天
去签到