bash命令进阶学习(Shell 元字符)

文章目录

I/O 重定向元字符

>(覆盖-标准-输出重定向)

bash 复制代码
ll > test.txt

可以在当前目录下的test.txt当中看到

txt 复制代码
总用量 0
drwxrwxr-x 1 tianbot tianbot  16 1月   5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月   5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot   0 1月   5 16:22 test.txt

由此可知实际的执行过程是先创建test.txt,再将ll的命令输出到test.txt

>>(追加-标准-输出重定向)

bash 复制代码
ll >> test.txt
bash 复制代码
总用量 0
drwxrwxr-x 1 tianbot tianbot  16 1月   5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 500 3月  10 14:20 ../
-rw-rw-r-- 1 tianbot tianbot   0 3月  17 17:25 test.txt
总用量 4
drwxrwxr-x 1 tianbot tianbot  16 1月   5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 500 3月  10 14:20 ../
-rw-rw-r-- 1 tianbot tianbot 172 3月  17 17:25 test.txt

可以看到在原来的基础上增加了输出

2>(覆盖-错误-输出重定向)

常用于将错误输出到日志当中

例如我在终端当中故意打错一个命令

bash 复制代码
aa 2> error.log 

运行之后 终端没有显示错误 但是打开error.log之后 会显示报错信息

bash 复制代码
bash: aa:未找到命令

2>>(追加-错误-输出重定向)

追加形式(不覆盖)

bash 复制代码
b 2>> error.log

运行之后error.log文件内

bash 复制代码
bash: a:未找到命令
bash: b:未找到命令

&>(覆盖-合并-输出重定向)

类型 编号 说明
标准输出 1 正常输出
标准错误 2 错误信息

&的意思就是将二者内容合并重定向输出

&>>(追加-合并-输出重定向)

同上,只是换为追加

<(标准输入重定向)

bash 复制代码
cat < test.txt

等同于cat test.txt

<<(Here document 嵌入文档-覆盖)

使用方式

bash 复制代码
命令 << 结束符
多行输入文本
结束符
bash 复制代码
cat > test.txt << oo
jvoabovoabvub
vaknvojbaeojv
vajbivbiabiehvb
vajobvibeiva~
oo

当中oo就是结束符,这个符号可以自己定义,在最后输入oo摁下回车之后上面的文本就被保存在了test.txt当中

<<<(Here string 嵌入字符串-覆盖)

使用方式

bash 复制代码
命令 <<< 字符串(引号可加可去)

举例

bash 复制代码
cat > test.txt <<< jcbaocb

管道与进程控制

|(管道)

第一个命令的输出作为下一个命令的输入,对于管道的使用较为频繁

查看文件内容并搜索特定行

bash 复制代码
cat test.txt | grep "hello"

可以理解为以下的形式

cat test.txt

|

grep "hello"

将cat test.txt的文本cat出来 然后使用grep搜索当中的hello字符串

查看进程并计数

bash 复制代码
ps ax | grep python | wc -l

ps:表示用户进程,即process status
a:显示所有用户的进程
x:显示没有控制终端的进程(如守护进程)

单独使用ps ax会出现

bash 复制代码
  PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:01 /sbin/init text
      2 ?        S      0:00 [kthreadd]
      3 ?        S      0:00 [pool_workqueue_release]
      4 ?        I<     0:00 [kworker/R-rcu_gp]
      5 ?        I<     0:00 [kworker/R-sync_wq]
      6 ?        I<     0:00 [kworker/R-slub_flushwq]
      7 ?        I<     0:00 [kworker/R-netns]
      ......

接下来将这些输出结果搜索与python相关的进程,即grep python

会输出

bash 复制代码
    726 ?        Ss     0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
 288053 pts/7    S+     0:00 grep --color=auto python

之后使用wc进行统计-l表示统计行数,可以得到最后的输出为

bash 复制代码
2

所以整体的命令就是所有进程当中与python相关的进程有几项

列出文件并按大小排序

bash 复制代码
ls -la | sort -nk5

查看环境变量

这条命令我个人比较喜欢,可以将环境变量当中的:换成换行,更加清晰

bash 复制代码
echo ${PYTHONPATH} | tr ':' '\n'

输出显示

bash 复制代码
/home/tianbot/study_ws/devel/lib/python3/dist-packages
/home/tianbot/.ros1/lib/python/site-packages
/home/tianbot/manipulation_ws/devel/lib/python3/dist-packages
/home/tianbot/tianbot_mini_ws/devel/lib/python3/dist-packages
/opt/ros/noetic/lib/python3/dist-packages
/usr/lib/python3/dist-packages

&(后台运行)

bash 复制代码
sleep 3 &

回车后会显示

bash 复制代码
[1] 268174

后面的数字代表PID

之后按回车键会显示

bash 复制代码
[1]+  已完成               sleep 3

jobs

对于长久在后台执行的任务,使用jobs可以显示所有在后台执行的任务

bash 复制代码
tianbot@tianbot:~$ sleep 20 &
[1] 1377273
tianbot@tianbot:~$ sleep 20 &
[2] 1378039
tianbot@tianbot:~$ jobs
[1]-  运行中               sleep 20 &
[2]+  运行中               sleep 20 &

kill %1

对于jobs显示的进程,可以使用kill+%+进程号的形式进行杀死

bash 复制代码
tianbot@tianbot:~$ sleep 20 &
[1] 1392733
tianbot@tianbot:~$ jobs
[1]+  运行中               sleep 20 &
tianbot@tianbot:~$ kill %1
tianbot@tianbot:~$ jobs
[1]+  已终止               sleep 20

;(命令分割-顺序执行)

没有逻辑判断,直接顺序执行

bash 复制代码
ll ; ll

会输出

bash 复制代码
总用量 4
drwxrwxr-x 1 tianbot tianbot  16 1月   5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月   5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot  10 1月   5 16:56 test.txt
总用量 4
drwxrwxr-x 1 tianbot tianbot  16 1月   5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月   5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot  10 1月   5 16:56 test.txt

||(逻辑或)

可以理解为:如果报错了就执行下一个命令

bash 复制代码
mkdir test || echo "创建失败"

&&(逻辑与)

可以理解为:执行完之后成功了再执行下一个(如果第一个命令失败了就没有之后了)

bash 复制代码
mkdir test && cd test

创建目录成功 → 再进入目录

变量

shell变量

直接在shell里面写,此时这个变量的作用范围就是当前shell脚本

bash 复制代码
name="Tom"

当然,如果使用unset可以提前终止其作用范围

bash 复制代码
unset name

环境变量

添加export

bash 复制代码
export ROS_MASTER_URI=http://localhost:11311

此时ROS_MASTER_URI就被添加到环境变量env当中了

可以使用env查看

bash 复制代码
env

也可以使用set查看,一般不用,因为其会显示

1、shell变量

2、环境变量

3、函数

bash 复制代码
set

$

变量/ {变量} ------ 读取变量

注意:这个变量可以是shell变量也可以是环境变量

bash 复制代码
echo ${BASH}

1 2 $3 ------ 脚本参数

比如创建一个脚本

bash 复制代码
#!/bin/bash

echo $1
echo $2

运行

bash 复制代码
./test.sh hello world

输出

bash 复制代码
hello
world

$0 ------ 当前脚本名

相当于第0个参数

$#------ 参数个数

$@ ------ 所有参数

$$ ------ 当前进程ID

$() ------ 命令替换

比如

bash 复制代码
dir=$(pwd)

echo $dir
#输出/home/user

$(( )) ------ 算术运算

bash 复制代码
a=10
b=20

c=$((a+b))

echo $c
# 输出30

{ }命令分组

{ } 没有创建新的 shell,变量修改会影响外部。

${}---变量替换

bash 复制代码
echo ${PATH}

( )子shell分组

子shell修改变量

父shell不受影响

$()---命令替换

激活mamba环境时

bash 复制代码
eval "$(micromamba shell hook --shell bash)"

eval "字符串"==把字符串当作命令执行

eval "pwd"==pwd

相关推荐
Lsir10110_2 小时前
【Linux】网络编程基础—套接字
linux·运维·服务器·网络·c++
Java小白笔记2 小时前
Linux中使用systemd服务单元定时任务
linux·服务器·网络
夏乌_Wx2 小时前
Linux 进程间通信 IPC 总结:管道 + 信号量 + 共享内存 + 消息队列(附代码)
linux·数据结构·算法
lucia_zl2 小时前
linux收集进程性能数据
linux·运维·chrome
Byte不洛2 小时前
手写一个C++ TCP服务器实现自定义协议(顺便解决粘包问题)
linux·c++·操作系统·网络编程·tcp
道亦无名4 小时前
Linux下是STM32的编译修改配置文件tensorflow
linux·运维
炸膛坦客10 小时前
Linux - Ubuntu - PC端:(三)切换中英文,Fcitx5
linux·ubuntu
7yewh10 小时前
jetson_yolo_deployment 01_linux_dev_env
linux·嵌入式硬件·yolo·机器人·嵌入式
cyber_两只龙宝10 小时前
【Haproxy】Haproxy的算法详解及配置
linux·运维·服务器·云原生·负载均衡·haproxy·调度算法