菜鸟科技网

shell 连接命令有哪些?

分号 - 顺序执行

这是最简单的方式,用分号隔开的多个命令会按顺序依次执行,无论前一个命令是否成功。

shell 连接命令有哪些?-图1
(图片来源网络,侵删)

语法:

command1 ; command2 ; command3

特点:

  • 命令之间是顺序关系。
  • command2 不会等待 command1 完成,而是会在 command1 启动后立即执行(但在同一个 Shell 进程中,所以是顺序的)。
  • command2 的执行不依赖于 command1 的退出状态(成功或失败)。

示例:

# 先创建一个文件,然后列出当前目录的内容,最后打印 "Done"
echo "Hello World" > hello.txt ; ls -l ; echo "Done"

即使 echo "Hello World" > hello.txt 失败(例如因为权限问题),ls -lecho "Done" 依然会执行。

shell 连接命令有哪些?-图2
(图片来源网络,侵删)

&& - 逻辑与(前一个命令成功才执行)

&& 是一个逻辑操作符,它连接的两个命令中,只有当 && 左边的命令成功执行(退出状态码为 0)时,右边的命令才会被执行

语法:

command1 && command2

特点:

  • 用于确保一系列命令按顺序执行,并且任何一个步骤失败,后续步骤就不再执行。
  • 常用于构建需要“原子性”或“链式”操作的命令。

示例:

shell 连接命令有哪些?-图3
(图片来源网络,侵删)
# 只有当 /tmp 目录存在时,才会进入它
cd /tmp && ls -l
# 先进入 /home 目录,如果成功,再切换到 user1 用户的主目录
cd /home && cd user1
# 创建目录,并在成功创建后,立即进入该目录
mkdir -p my_new_dir && cd my_new_dir

cd /tmp 失败(/tmp 不存在),ls -l 就不会执行。


- 逻辑或(前一个命令失败才执行)

也是一个逻辑操作符,它连接的两个命令中,只有当 左边的命令执行失败(退出状态码非 0)时,右边的命令才会被执行

语法:

command1 || command2

特点:

  • 用于提供“备选方案”或“错误处理”。
  • 如果第一个命令成功,第二个命令就不会执行。

示例:

# 尝试删除文件,如果删除失败(文件不存在),则打印提示信息
rm important_file.txt || echo "警告:文件不存在或无法删除!"
# 尝试连接到一个不存在的服务器,如果连接失败,则打印本地时间
ping -c 1 192.168.1.999 || echo "连接失败,当前时间是: $(date)"

rm important_file.txt 成功删除了文件,echo 命令就不会执行。


管道 - 将前一个命令的输出作为后一个命令的输入

管道是 Shell 最强大的功能之一,它将 左边命令的标准输出 作为 右边命令的标准输入

语法:

command1 | command2

特点:

  • 命令是同时并发执行的,而不是顺序的,Shell 会建立一个管道连接两个进程。
  • 主要用于数据流处理,将一系列命令像流水线一样串联起来,完成复杂的数据处理任务。

示例:

# 1. 查看当前运行的进程,并过滤出包含 "sshd" 的行
ps aux | grep sshd
# 2. 获取系统内存使用情况,并只显示 "MemAvailable" 这一行
free -h | grep "MemAvailable"
# 3. 统计一个文件中每个单词出现的次数(经典示例)
cat /etc/passwd | tr ' ' '\n' | sort | uniq -c | sort -nr

在这个经典示例中,数据流是这样的: cat 输出 -> tr 将空格换行 -> sort 排序 -> uniq -c 合并并计数 -> sort -nr 按数字逆序排序。


命令替换 或反引号 `

命令替换的作用是执行一个命令,并将其输出结果捕获,然后嵌入到当前命令行中

语法:

# 现代 Shell (推荐) 使用 $()
output=$(command)
# 旧式 Shell 使用反引号
output=`command`

特点:

  • 将一个命令的执行结果赋值给一个变量,或者作为另一个命令的参数。
  • 强烈推荐使用 ,因为它更易于嵌套,并且可以避免与反引号在复杂脚本中的混淆。

示例:

# 1. 获取当前日期并赋值给变量
today=$(date +%Y-%m-%d)
echo "今天的日期是: $today"
# 2. 获取当前目录下有多少个文件,并打印出来
file_count=$(ls | wc -l)
echo "当前目录共有 $file_count 个文件。"
# 3. 嵌套使用:获取前一天系统负载的平均值
# 先获取昨天的日期,然后用这个日期去取日志
load=$(uptime | awk -F'load average:' '{ print $2 }')
echo "系统负载: $load"

&& 和 的组合使用

&& 和 可以组合使用,形成更复杂的逻辑判断,类似于编程语言中的 if-else 结构。

语法:

# if command1; then command2; else command3; fi
command1 && command2 || command3

这个组合的逻辑是:command1 成功,则执行 command2command1 失败,则执行 command3

注意: 这种写法在 command1 成功但 command2 失败时,command3 也会被执行,这并不完全等同于 if-else,但在很多简单场景下非常方便。

示例:

# 尝试删除文件,如果成功则打印 "删除成功",否则打印 "删除失败"
rm file.txt && echo "删除成功" || echo "删除失败"
# 尝试创建一个目录,如果成功则进入,否则打印错误
mkdir -p my_dir && cd my_dir || echo "创建或进入目录失败"

总结与对比

连接符 名称 作用 示例
顺序执行 按顺序执行所有命令,无论前一个是否成功。 cmd1; cmd2; cmd3
&& 逻辑与 只有前一个命令成功,才执行下一个。 cmd1 && cmd2
逻辑或 只有前一个命令失败,才执行下一个。 cmd1 || cmd2
管道 将前一个命令的输出作为后一个命令的输入。 cmd1 \| cmd2
命令替换 执行命令,并将其输出结果嵌入到当前命令行。 var=$(cmd)
&& 组合 条件执行 实现 if-then-else 的简单逻辑。 cmd1 && cmd2 \| cmd3

掌握这些连接命令是熟练使用 Shell 的关键,它们能让你用简洁的命令行完成非常复杂的任务。

分享:
扫描分享到社交APP
上一篇
下一篇