Linux sh命令

目录

  • [一. 基本语法](#一. 基本语法)
  • [二. 选项](#二. 选项)
    • [2.1 -c 字符串中读取内容,并执行](#2.1 -c 字符串中读取内容,并执行)
      • [2.1.1 基本用法](#2.1.1 基本用法)
      • [2.1.2 获取当前目录下失效的超链接](#2.1.2 获取当前目录下失效的超链接)
    • [2.2 -x 每个命令执行之前,将其打印出来](#2.2 -x 每个命令执行之前,将其打印出来)
    • [2.3 结合Here文档使用](#2.3 结合Here文档使用)

一. 基本语法

⏹Linux 和 Unix 系统中用于执行 shell 脚本 或 运行命令 的命令。

bash 复制代码
sh [选项] [脚本文件] [参数...]

⏹选项

  • -c:从字符串中读取内容,并执行。
  • -x:在每个命令执行之前,将其打印出来。
  • -s:从标准流中读取内容,并执行。

二. 选项

2.1 -c 字符串中读取内容,并执行

2.1.1 基本用法

  • sh -c 是一个用于在子 shell 中执行命令的选项。
  • 允许你通过命令行传递一个字符串作为命令,并在一个新的 shell 实例中运行这个命令。
  • 这个功能非常有用,尤其是在需要运行复杂命令或多条命令时。
bash 复制代码
fengyehong@ubuntu:~$ sh -c 'echo "Hello World"; echo "你好 世界"'
Hello World
你好 世界

⏹执行时,传递参数。
--:用于分隔脚本命令和参数。

bash 复制代码
fengyehong@ubuntu:~$ sh -c 'echo "Hello $1"; echo "你好 $2"' -- "World" "世界"
Hello World
你好 世界

⏹接收管道符提供的标准流,打印文件的名称 和 文件的大小

  • xargs -I {}:占位符
  • du -h:根据文件名获取文件大小
bash 复制代码
fengyehong@ubuntu:~$ ls *.exe | xargs -I {} sh -c 'echo -n "文件名称为: {} "; echo "文件大小为: $(du -h "{}" | awk "{print \$1}")"'
文件名称为: centbrowser_5.1.1130.129_x64.exe 文件大小为: 137M
文件名称为: fdm_x64_setup.exe 文件大小为: 4.0K

2.1.2 获取当前目录下失效的超链接

  • 查找当前目录下的所有符号链接,并对每个符号链接执行 test -e
  • 若链接已失效(目标不存在),则输出该符号链接的路径。
bash 复制代码
fengyehong@ubuntu:~/jmw_work_space/20240914$ find $(pwd) -type l -print | xargs -I {} sh -c 'test -e {} || echo {}'
/home/fengyehong/jmw_work_space/20240914/temp_link

2.2 -x 每个命令执行之前,将其打印出来

⏹sh脚本中不含有变量的情况

bash 复制代码
# 获取要执行的sh脚本的内容
fengyehong@ubuntu:~/jmw_work_space/20240914$ cat my_sh.sh
echo "HELLO WORLD!"
echo "你好,世界!"

# 执行脚本之前先把要指定的脚本的内容打印出来
fengyehong@ubuntu:~/jmw_work_space/20240914$ sh -x my_sh.sh
+ echo HELLO WORLD!
HELLO WORLD!
+ echo 你好,世界!
你好,世界!

⏹sh脚本中有不需要计算和需要计算的变量的情况

bash 复制代码
fengyehong@ubuntu:~/jmw_work_space/20240914$ cat my_sh.sh
# 简单的echo打印部分
echo "HELLO WORLD!"
msg="你好,世界!"
echo ${msg}

# 计算文件的总数量,然后打印
txt_file_count=$(find ~ -name "*.txt" | wc -l)
echo "txt文件的总数量为: ${txt_file_count}"

fengyehong@ubuntu:~/jmw_work_space/20240914$
fengyehong@ubuntu:~/jmw_work_space/20240914$ sh -x my_sh.sh
+ echo HELLO WORLD!
HELLO WORLD!
+ msg=你好,世界!
+ echo 你好,世界!
你好,世界!
+ find /home/fengyehong -name *.txt
+ wc -l
+ txt_file_count=134
+ echo txt文件的总数量为: 134
txt文件的总数量为: 134

2.3 结合Here文档使用

bash 复制代码
# 定义一个变量
fengyehong@ubuntu:~$ my_var="你好,世界!"

# 使用Here文档输入多行命令后,执行
fengyehong@ubuntu:~$ sh << _EOF_
> echo "当前文件数量为: $(ls -l | wc -l)"
> echo "外部变量值为:${my_var}"
> _EOF_
当前文件数量为: 14
外部变量值为:你好,世界!
相关推荐
璞致电子1 天前
fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
linux·嵌入式硬件·学习·fpga开发·fpga·fpga开发板·xilinx开发板
第四维度41 天前
【全志V821_FoxPi】9-2 Linux IIC驱动MPU6050
linux·传感器·tina·mpu6050·v821
mjx65301 天前
PyTorch快速入门
linux
DeeplyMind1 天前
AMD KFD的BO设计分析系列6-1: VRAM BO的显存分配分析
linux·驱动开发·amdgpu·rocm·kfd
我言秋日胜春朝★1 天前
【Linux网络编程】多路转接reactor——ET模式的epoll
linux·服务器·网络
Hell_Yrz1 天前
Golang信号处理实战
linux
四桑.1 天前
uniapp运行微信小程序uni为什么是undefined
linux
用户31187945592181 天前
perl-Test-Simple-1.302195-5.fc39.noarch.rpm 怎么安装?Fedora 39 安装步骤讲解
linux
焦思懿--19期--工职大1 天前
VMWare和物理机之间文件传输
linux·服务器·网络·电脑
四桑.1 天前
echarts6.0.0版本,平行坐标图形,series为多组时,横线溢出绘图区域,如何解决
linux