文章目录
bash学习资源
bash命令行参数
bash作为一个可执行文件,本身也带有一些命令行参数,详情如下:
参数说明
-c
若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数。
-n
检测脚本是否正确,并不执行脚本
-i
若用-i参数,则bash是交互的。
-s
若用-s参数,则bash从标准输入中读入命令(在执行完-c带的命令之后。)直到输入exit。
-x
执行脚本,输出执行过程,调试利器
-
单一的号表明参数执行完毕,并且屏蔽此后所跟参数,后面的所有变量都被看作是文件名。
-norc
如果bash是交互的,则不执行个人初始化文件:-/.bashrc,如果bash作为sh来运行,这个参数缺省是关闭的。
-noprofile
不执行系统范围的启动文件/etc/profile也不执行个人的启动文件-/.bash_profile,-/.bash_login或-/.profile,缺省情况下,bash作为登录的shell时以这些文件作为启动文件。
--refile文件名
如果bash是交互的,则以此文件作为bash的启动文件。替代-/.bashrc。
-version
在bash开始时显示此bash的版本号。
-quiet
不显示版本号和其他信息,这是缺省值。
-login
激活bash,伪装为登录shell。
-nobraceexpansion
不执行大括号扩展。
-nolineediting
在交互状态下不使用GNU的readline库去读取命令。即取消了命令行编辑功能。
-posix
改变bash的行为,使其符合Posix 1003.2规定的标准。
参考:http://linux.51yip.com/search/bash
bash中变量使用
bash中直接用=
符号进行变量定义,如定义变量name=csdn
。
如果要引用一个变量,可以在变量名前加上$
符号,使用变量:$name
,也可以${name}
这样,可以实现字符串的组合。
#!/usr/bin/env bash
var="this is string"
echo $var
read name
echo "hello, $name"
echo "lidar_roof_0/lidar_roof_0_${name}.bag"
注意:
1、bash中变量定义=
两边不能有空格;
2、定义字符串变量可以不加引号;
3、单引号字符串,即使加了$
也不认为是变量引用;
4、左引号内内容会被当做命令执行:
str="Current date is `date`"
echo $str
输出结果为:
Current date is 2020年 06月 21日 星期日 08:52:21 CST
相似用法可以用$()
表示:
str="Current date is $(date)"
echo $str
常用系统变量
$USER #当前用户名
uname -r #当前系统内核发行号
uname -n #主机名
MACHINE_ARCH=$(uname -m) #当前机器架构x86_64
$HOME #当前用户home路径
常用函数
set命令用法:
http://www.ruanyifeng.com/blog/2017/11/bash-set.html
read函数:
当运行到该句时,会等待终端输入,然后读取终端输入内容。
命令执行控制
https://blog.csdn.net/qq_41248471/article/details/101948315
在shell中执行命令时,有时候需要在一条语句中执行多条命令,这就需要控制命令的执行顺序及逻辑。
包括:; && 与||
。
用法示例:
1) command1 ; command2
2) command1 && command2
3) command1 || command2
使用”;”
时,不管command1
是否执行成功都会执行command2
;
使用”&&”
时,只有command1
执行成功后,command2
才会执行,否则command2
不执行;
使用”||”
时,command1
执行成功后command2
不执行,否则去执行command2
.
条件语句
几种书写格式:
if [ $# -gt 0 ]
then
echo "has arguments"
else
echo "don't have arguments"
fi
或者
if [ $# -gt 0 ]; then
echo "has arguments"
else
echo "don't have arguments"
fi
参考:
https://wiki.jikexueyuan.com/project/shell-tutorial/shell-if-else-statement.html
https://blog.csdn.net/qq_34769161/article/details/88761836
http://www.jquerycn.cn/a_8629
https://blog.csdn.net/lz_equal/article/details/51817043?locationNum=11&fps=1
https://www.jb51.net/article/56553.htm
https://blog.csdn.net/puqutogether/article/details/45815003
#!/usr/bin/env bash
name="2019_09_26_06_56_07"
has_ego_tf="true"
has_lidar_roof_0="true"
if [[ $has_ego_tf = "true" ]]; then
ego_tf_bag_name="ego_tf/ego_tf_${name}.bag"
echo $ego_tf_bag_name
fi
if [ $has_lidar_roof_0 = "true" ]; then
lidar_roof_0_bag_name="lidar_roof_0/lidar_roof_0_${name}.bag"
echo $lidar_roof_0_bag_name
fi
final_play_bags="${ego_tf_bag_name} ${lidar_roof_0_bag_name}"
echo "final play: $final_play_bags"
rosbag play ${final_play_bags}
数值大小判断:
a=10
b=20
if [ $a == $b ] #或者用-eq
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
其他常用选项:
全部选项查询:https://blog.csdn.net/doiido/article/details/43966819
-d:文件是否为目录
-e:文件是否存在
-x:文件是否可以执行
-f:文件是否为常规文件
-r:文件是否可读
-p:文件是否为命名管道
-b:文件是否为块设备文件
-c:文件是否为字符设备文件
case条件
1、根据传递参数决定执行具体语句
#!/usr/bin/env bash
case $1 in
install)
echo "install"
;;
uninstall)
echo "uninstall"
;;
*)
echo "everything"
;;
esac
执行情况:
bash install.sh
bash install.sh install
bash install.sh uninstall
错误解决:
1、运行shell脚本时报错”[[ : not found”解决方法
sh命令无法识别”[[]]”表达式。
解决办法:bash与sh是有区别的,两者是不同的命令,且bash是sh的增强版,而”[[]]”是bash脚本中的命令,因此在执行时,使用sh命令会报错,将sh替换为bash命令即可。
2、利用case条件来控制用户输入来决定是否执行程序
# run.sh
read -r -p "Are You Sure? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "Yes"
;;
[nN][oO]|[nN])
echo "Exit"
exit 1
;;
*)
echo "Invalid input..."
exit 1
;;
esac
执行:
bash run.sh
循环语句
for i in 1 2 3 4 5
do
echo "Hello world $i"
done
#Output
Hello world 1
Hello world 2
Hello world 3
Hello world 4
Hello world 5
echo -e
—— 加上-e,指支持反斜杠控制的字符转换
http://c.biancheng.net/view/934.html
$@ —— 用来传递参数,获取所有参数,并且不管参数带不带引号,都按空格切分
$#——传递的参数个数,不包括$0;
$?—— 获取上一次命令执行的返回值,一般 执行 成功 返回0。
https://blog.csdn.net/wh_19910525/article/details/8165506
函数定义:
http://c.biancheng.net/view/1009.html
参数传递与引用:
https://www.cnblogs.com/kaishirenshi/p/10254085.html
shift的使用:
https://blog.csdn.net/zhu_xun/article/details/24796235
函数定义:
其他用法
获取当前脚本的路径相关信息:
https://my.oschina.net/u/4309414/blog/3613891/print
${BASH_SOURCE[0]}
取得该shell文件所在路径
1、获取该脚本绝对路径
DIR="$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/${BASH_SOURCE[0]}"
echo $DIR
2、获取该脚本所在目录绝对路径
DIR="$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo $DIR
另一种写法:
readonly SCRIPT_DIR=$(dirname "$(readlink -f "${BASH_SOURCE}")")
echo $SCRIPT_DIR
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121234.html