bash常见用法速览

导读:本篇文章讲解 bash常见用法速览,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

bash学习资源

快速学习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

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!