ROS2开发基础之Linux与shell入门
一、Linux操作系统操作入门
1.1Linux常用命令
1.1.1CD基础语法
(1)pwd 当前所在文件的绝对路径
(2)cd 和 cd ~ 返回/home/admin 自己的家目录
(3)cd . 切换到当前目录
(4)cd .. 返回上一级目录
(5)cd / 返回上一次所在目录
(6)cd - 返回上一次所在目录
切换目录:
绝对路径:在输入路径是,最前面是/或者~表示从根目录/家目录开始的具体目录位置
相对路径:在输入路径时,最前面不是/或者~表示相对当前目录所在的目录位置

1.1.2LS查看
列出目录列表
ls是用户最常用的命令之一。
1. Linux文件或者目录名称最长可以有256个字符
2. “.”代表当前目录
3. “..”代表上一级目录
4. “.”开头的文件为隐藏文件,需要用-a参数才能显示。
ls -l 显示当前目录下所有文件的详细信息,不带-l就不显示详细信息
ls -a 展示当前文件夹下所有文件内容包含隐藏文件(隐藏文件就是带点的文件)
ls -lh 展示当前文件的详细信息以能够认识的文件单位展示
ls -alh 可以混合使用顺序可以随意更改
ls 文件夹 可以查询这个文件夹中的内容

1.1.3新建和删除(文件/文件夹)
touch 创建文件或修改文件时间。
如果文件不存在,可以创建一个空白文件;
如果文件已经存在,可以修改文件的末次修改日期
mkdir 创建一个新的目录、文件夹
新建目录的名称不能与当前目录中已有的目录或文件同名。
-p 可以递归创建目录(一次性创建多层级目录)
rm 删除文件或目录,文件删除后不能恢复。
为了防止文件误删,可以在rm后使用-i参数以逐个确认要删除的文件。
-i 以进行交互式方式执行
-r 递归地删除目录下的内容,删除文件夹时必须加此参数


1.3.4拷贝CP和移动(剪切)MV
cp 源文件 目标文件
-i:交互式复制,在覆盖目标文件之前将给出提示要求用户确认
-r:若给出的源文件是目录文件,则cp将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
-v:显示拷贝情况

mv 源文件 目标文件
-i:确认交互方式操作,如果mv操作将导致对已存在的目标文件的覆盖,系统会询问是否重写,要求用户回答以避免误覆盖文件
-v:显示移动情况
注意:移动可以不加-r就可以实现目录的移动

1.3.5查看文件内容(cat)
cat 命令可以用来查看文件内容,cat 会一次显示所有内容,适合查看内容较少的文本文件
-b 对非空输出行编号
-n 对输出的所有行编号

1.3.6分屏显示内容(more)
more 命令可以用于分屏显示文件内容,每次只显示一页内容,适合内容较多的文本文件
空格键 显示下一屏
Enter键 一次滚动一行
b 回滚一屏
f 向下滚一屏
q 退出
/word 搜索word关键字

1.3.7查找文件中的内容(grep)
grep 要查找的内容 目标文件
-n 默认不显示行号,-n代表显示行号
-i 默认区分大小写,-i 代表不区分大小写
-v 取反,找除了书写在这里的内容之外的内容
^内容 以内容为开始的
内容$ 以内容为结尾的
[啊哈] 其中一个匹配即可(or)

grep -rn 参数详解
完整命令:grep -rn "关键词" 目录
示例 1:递归搜索当前目录,带行号
含义:在当前目录所有文件递归查找 error,并显示每行行号
grep -rn "error" ./
1.3.8重定向
Linux 允许将命令执行结果,重定向到一个文件,将本应显示在终端上的内容覆盖/追加到指定文件中
> 覆盖文件原有内容
>> 表示追加,把内容追加到已有文件的末尾



1.3.9管道 |
Linux 允许将一个命令的输出通过管道做为另外一个命令的输入,向管道塞东西 | 通过管道得到左边的内容

1.3.10查找文件(find)
find 路径 -name "内容"
.或./ 或不写,都可以代表当前路径
*通配符:模糊查询,在使用find命令时也可以用
可以把当前目录和它的下级所有目录中满足条件的文件文件夹都找出来


1.3.11软链接ln
ln -s 源文件 链接文件
软连接: 类似Windows里的快捷方式; 修改其中一个, 另一个也会变; 删除源文件, 链接文件失效; 反之无影响
软链接只是指向源文件的一个链接
源文件要使用绝对路径, 不能使用相对路径, 这样可以方便移动链接文件后, 仍然能够正常使用
软链接可以链接目录
注:删除链接文件,源文件不受影响,删除源文件链接文件也被删除
1.3.12硬链接ln
ln 源文件 链接文件
在使用 ln 创建链接时,如果没有 -s 选项,会创建一个硬链接,即使删除了源文件,链接文件还存在,相当于复制了一份;所以软链接是更常用的方式。
1.3.13打包、解包
tar 是Linux中最常用的备份工具,此命令可以把一系列文件打包到一个大文件中,也可以把打包的文件恢复成一系列文件。
打包文件:
tar -cvf 打包文件.tar 被打包的文件/路径...
解包文件:
tar -xvf 打包文件.tar
-c 生成档案文件,创建打包文件
-v 列出归档解档的详细过程
-f 指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后
-t 列出档案中包含的文件
-x 解开档案文件


1.3.14压缩、解压缩
tar 与 gzip组合使用,可实现文件打包和压缩用gzip压缩打包后的文件,其扩展名一般用xxxx.tar.gz
gzip [选项] 被压缩文件 # 前提tar包已存在
-r 递归目录操作目录中的文件
-d 解压

1.3.15打包&压缩、解包&解压缩(gzip日常 90% 场景)
打包压缩文件:
tar -zcvf 打包文件.tar.gz 被打包压缩的文件/路径...
解压缩文件:
tar -zxvf 打包文件.tar.gz
解压缩到指定路径:
tar -zxvf 打包文件.tar.gz -C 目标路径
查看压缩包内文件:
tar -ztvf test.tar.gz


1.3.16打包&压缩、解包&解压缩(bzip)
打包压缩文件:
tar -jcvf 打包文件.tar.gz 被打包压缩的文件/路径...
解压缩文件:
tar -jxvf 打包文件.tar.gz
解压缩到指定路径:
tar -jxvf 打包文件.tar.gz -C 目标路径
1.3.17zip、unzip压缩解压缩
压缩文件:
zip -r 压缩后文件名.zip 要压缩的文件
解压缩文件:
unzip -d 解压后的目录 打包的文件.zip
1.2Linux用户权限
1.2.1权限基础
| 目录 | 拥有者权限 | 组权限 | 其他用户权限 | |||||||
| 文件权限示例 | - | r | w | - | r | w | - | r | - | - |
| 目录权限示例 | d | r | w | x | r | w | x | r | - | x |
| 序号 | 权限 | 英文 | 缩写 | 数字代号 |
| 1 | 读 | read | r | 4 |
| 2 | 写 | write | w | 2 |
| 3 | 执行 | excute | x | 1 |
| 4 | 无权限 | - | 0 |

1.2.2字母法设置权限
chmod 权限设置 要设置权限的文件
| 用户 | 含义 |
| u | user 表示该文件的所有者 |
| g | group 表示与该文件的所有者属于同一组者,即用户组 |
| o | other 表示其他以外的人 |
| a | all 表示这3者皆是 |
| 增减权限 | 含义 |
| + | 增加权限 |
| - | 撤销权限 |
| = | 设定权限 |


1.2.3数字法设置权限(常用)
chmod 在设置权限时,可以简单的使用三个数字分别对拥有者、组、其他用户的权限

1.2.4退出(exit)
如果是图形界面,退出当前终端;如果是使用ssh远成登录,退出登录账户;如果是切换后台登陆用户,退出则返回上一个登录账号
1.2.5切换用户权限(su root)
1.2.6重启和关机
reboot 重新启动操作系统执行命令后立即重启操作系统
shutdown 关闭操作系统
shutdown -r now 会直接重启操作系统
shutdown -h now 立刻关机,其中now相当于时间为0的状态
shutdown -h 20:25 系统在今天的20:25 会关机
shutdown -h +10 系统再过十分钟后自动关机
1.2.7查看&关闭进程
进程:当前正在执行的一个程序
ps -aux 查看当前系统中正在执行程序的详细状况
a 显示终端上的所有进程,包括其他用户的进程
u 显示进程的详细状态
x 显示没有控制终端的进程
每一个进程拥有唯一的pid 可以根据PID杀死进程
kill -9 PID # -9表示强行终止
ps -aux | grep firefox
top 动态显示运行中的进程并且排序,退出q
pkill 进程名 # 根据进程的名字进行关闭


ss -tulnp | grep :端口号
参数详细解析:
-t:显示 TCP 连接。-u:显示 UDP 连接。-l:仅显示处于监听(LISTEN)状态的端口(如果你还想看已建立的连接,可以去掉这个参数)。-n:以数字形式显示端口号,而不是解析成服务名称(例如显示80而不是http),这样查询更精准。-p:显示占用该端口的进程信息(PID 和进程名)。注意:查看其他用户的进程或系统进程时,通常需要加上sudo权限。
实际示例:
假设你想查询 8080 端口的占用情况,可以执行:
sudo ss -tulnp | grep :8080
1.2.8端口号占用问题解决
列出当前系统打开的文件,可以用于查看系统中正在使用端口的详细信息(一般需要root用户权限)
netstart 用于查看显示网络状态
sudo netstart -tulnp | grep 3306
-t 显示TCP连接
-u 显示UDP连接
-l 仅显示监听套接字(即等待进入连接的套接字)
-n 以数字形式显示地址和端口号,不进行DNS解析
-p 显示与每个套接字关联的进程ID和名称
1.2.9实时监控(查看日志)
head 文件名 #显示文件前10行内容
head -15 文件名 # 显示文件前15行内容
tail 文件名 # 显示文件后10行内容,如果不加参数默认显示文件后10行内容
tail -15 文件名 # 显示文件结尾15行内容
tail -f 文件名 实时监控文件内容,用于查看线上服务的运行日志,实时显示写入日志信息
实时监控文件变化:
不停的向文件写入内容:ping www.baidu.com > temp.txt
实时监控:tail -f temp.txt


1.2.10查看操作系统信息(hostnamectl)

二、shell编程实践基础
2.1shell编程基础入门
2.1.1shell简介
A、shell是什么?
A-1、shell 也是一门计算机语言,和 Python | Java ... 一样,可以用来编写程序
A-2、shell 编写的程序常见实现: GUI(图形化界面) + CLI(命令行用户接口)
A-3、shell 字面意思: 壳, shell 是一种保护机制,保护的是"核", 在计算机中,shell 程序保护的是操作系统
B、为什么?
shell 保护了操作系统,在用户和操作系统之间,shell 程序扮演了翻译的角色,把用户输入的代码,转换为二进制 01
windows 下 shell 编程(了解)
想要在 calc 可以在命令行中打开记事本
1. 编写一个 shell 文件 calc ,后缀名是 .bat 批处理程序
2. 直接双击运行即可
Linux 下的 shell 编程(重点)
规范:
shell脚本的第一行建议声明解释shell文件使用的解释器
格式:
#!/bin/bash 或者 #!/bin/sh 或者 #!/bin/csh
常用第一种,无太多差异,不同的实现方式而已
运行shell文件:
在文件所属的目录进入命令行:
sh xxxx.sh


2.1.2shell语法变量(重点)
A、是什么?
变量:是数据的载体,变量实现时,就是为数据命名,根据变量名可以调用数据
B、怎么用?(重点)
直接创建sh文档,在终端中打开
声明变量、调用变量
增:变量名=变量值值可以使用单引号、双引号、直接写三种形式
注意:赋值符号=
左右两侧不能有空格 name="张三"
变量细节:
双引号会执行其中的调用语法,单引号会原样输出


实现打印三种形式:
echo ${变量名};echo "${变量名}";echo $变量名
2)变量值中出现语法需要使用的特殊符号时,可以对该符号使用\进行转义;单引号不能使用转义\
例如:name4="张三"李四" # 中间"就是一个普通字符


3)unset 删除变量


2.1.3传参


2.1.4读取用户输入
语法:read -p '提示语句' 变量名


2.2shell编程进阶操作
2.2.1命令变量
需求:将一个命令执行的结果赋值给变量
例如:result=`ls`
echo "$result"
ls不在单独作为一个变量而且可以执行的指令ls

wc -l 查看文件和文件夹的个数

2.2.2算数 运算符
语法:$(($num1+$num2))
符号:+ - * / %

2.2.3比较运算符
语法:[ 表达式 ]
name1="hello gz"
name2="hello gz"
[ "${name1}" -符号 "${name2}" ]
大于 -gt(greater than)
大于等于 -ge(greater equals)
小于 -lt(less than)
小于等于 -le(less equals)
等于 -eq(equals)
不等于 -ne(not equals)

2.2.4逻辑运算符
语法:[ 表达式 ]
与 -a(and)
或 -o(or)
非 !
例如:
[ "${name1}" -gt "${name2}" -a "${name1}" -lt "${name2}"]

2.2.5字符串比较
语法:[ 表达式 ]
==或= 判断字符串内容是否一样
!= 判断两个字符串内容不等
-z 判断字符串是否为空
例如 [ $str1 == $str2 ]

2.2.6判断文件
语法:[ 表达式 ]
符号:
-e 文件或文件夹是否存在 exists
-d 是不是文件夹 dir
-f 是不是文件 file
例如:
[ -e /home ]
[ -d /hehe.txt ]

2.3shell编程流程控制与函数
2.3.1函数
function(可选) 函数名(){
函数体
}
函数调用:
函数名
注意:1 函数不调用不执行2 在shell中函数必须先声明再调用3 解释器执行特点从上往下逐行执行

2.3.2函数传参
带参函数:
1调用函数时,需要传递参数
函数名 参数1 参数2 参数3......
2 函数执行时,需要获取传递的参数
$N == 对应传入的第N个参数
$0 == 获取脚本的文件名
$* == 获取所有参数
$# == 获取参数个数

2.3.3单双分支语句(重要)
单分支语法:
if [ boolean表达式 ]
then
代码实现(条件表达式满足就执行不满足就不执行)
fi

单分支语法:
if [ boolean表达式 ]
then
代码实现(条件表达式满足就执行不满足就不执行)
else
代码实现(条件表达式不满足就执行)
fi

2.3.4多分支语句
语法:
if [ 条件1 ]
then
code1
elif [ 条件2 ]
then
code2
elif [ 条件3 ]
then
code3
....
else
codeN
fi
2.3.5case基础
case 输入数字 in
1)
执行代码;;
2)
执行代码;;
esac
2.3.6for循环
for 变量名 in 1 2 3
do
循环体
done
# 格式1:参数1 参数2 参数3......
# 格式2:seq命令
seq N == 获取[1-N]之间的所有整数
seq N1 N2 == 获取[N1-N2]之间的所有整数
seq N1 N2 N3 == 获取[N1-N2]之间的整数,每次获取时都在上一个数字的基础上 +N2(默认+1),N2代表步长
#! /bin/bash
echo "格式1:参数1 参数2 参数3......"
echo "循环1-10"
for num in 1 2 3 4 5 6 7 8 9 10
do
echo "$num"
done
echo "======================="
echo "格式2:seq命令 "
echo "eq N == 获取[1-N]之间的所有整数"
echo "循环1-10"
for num in `seq 10`
do
echo "$num"
done
echo "======================="
echo "格式2:seq命令 "
echo "seq N1 N2 == 获取[N1-N2]之间的所有整数"
echo "循环5-10"
for num in `seq 5 10`
do
echo "$num"
done
echo "======================="
echo "格式2:seq命令 "
echo "循环5-10,步长为2"
for num in `seq 5 2 10`
do
echo "$num"
done
2.3.7while循环
while [ boolean 表达式 ]
do
循环体
done
2.3.8重定向
shell重定向,将命令运行的结果存储到磁盘文件
格式1:>>追加
命令 1>> 磁盘文件(将正常执行结果输出到磁盘文件,文件可以事先不存在,内容是累加到文件中)
命令 2>> 磁盘文件(将错误命令运行时报错提示输出到磁盘文件,前提是命令代码有误,2 的错误日志才会写到文件中,不出错就不会执行)
格式2:>覆盖
2.3.9数组
增:数组名=(值1 值2 值3......)
查:查询指定
${数组名[索引]} #索引从0开始
查:查询全部
${数组名[*]}
${数组名[@]}
查:查询长度
${#数组名[*]}
${#数组名[@]}
改:数组名[索引]=新值
删除:unset 数组名
#! /bin/bash
echo "定义数组"
arr1=("张三" "李四" "王五" "赵六")
echo "查:查询指定"
echo "${arr1[1]}"
echo "==============="
echo "查:查询全部"
echo "${arr1[*]}"
echo "==============="
echo "改:数组名[索引]=新值"
echo "查:查询全部"
echo "${arr1[*]}"
arr1[2]=="和和"
echo "查:查询全部"
echo "${arr1[*]}"
cho "==============="
echo "查:查询长度"
echo "${#arr1[@]}"
cho "==============="
echo "删除:unset 数组名"
unset arr1
echo "查:查询全部"
echo "${arr1[*]}"
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)