序言
- 通过shell脚本遍历文件夹下所有bag并自动播包
1. 脚本
-
运行
touch xxx.sh # 新建脚本 vim xxx.sh # 编辑脚本 chmod 777 xxx.sh # 赋予运行权限 ./xxx.sh # 运行脚本
-
脚本内容
#! /bin/bash run_bags() { #echo $1 for file in `ls $1` do #if [ -f "$file" ]; then if [ "${file#*.}"x = "bag"x ]; then rosbag play "$file" --topic /your_topic_name fi done } path=$(cd $(dirname $0);pwd) run_bags $path
-
循环运行的脚本内容
#! /bin/bash run_bags() { files=$(ls ./*.bag) # files='ls ./*.bag' # $(ls ./*.bag) 或 'ls ./*.bag'都可以 for file in $files # 或者直接写成 for file in 'ls ./*.bag' do rosbag play "$file" --topic /your_topic_name done } path=$(cd $(dirname $0);pwd) while true do run_bags $path done
2. 说明
-
dirname $0
-
dirname用于获取目录名,如获取当前脚本目录
script_dir=$(cd $(dirname $0);pwd) dirname /usr/bin/ # 输出 /usr dirname xxx.sh # 输出 .
-
$0表示shell本身的文件名
注意=赋值前后没有空格
-
-
`ls $1`
- ``是英文输入法下的``,不是单引号’',表示执行系统命令
- $1表示shell脚本的第一个参数,这里指run_bags函数的第一个参数,即脚本所在路径
-
test命令
- 用于检查某个条件是否成立,也可以简写为[],用法为[ expression ],注意前后都有空格
- 可以用来进行 (1) 数值比较; (2) 字符串比较; (3) 文件比较
- 具体用法参考 shell中test命令
-
"${file#*.}"x = "bag"x
- 用于获取文件后缀判断文件类型,如.txt .bag等
- #是贪婪操作符,从左到右匹配,匹配到最右边的.号,移除包含.号的左边内容
- 加x是为了防止字符串为空时报错
-
报错 binary operator expected
- 加上双引号解决,如 if [ -f “$file” ]
-
ls ./*.bag
- ./是当前目录,可以修改为任意bag所在目录
- *.bag匹配 any_name.bag
【参考文章】
shell遍历目录下所有文件
shell获取脚本当前路径
binary operator expected报错解决
shell获取文件前缀、后缀
shell获取文件后缀判断文件类型
ls获取所有目录/文件
created by shuaixio, 2023.08.08