bash脚本
Shebang行
脚本的第一行需要指定解释器,(即当前脚本需要通过什么解释器执行),这一行以#!字符开头,这个字符成为Shebang,所以这一行也叫作Shebang行
#!之后就是脚本解释器的位置,bash脚本的解释器一般就是/bin/sh或者 /bin/bash。如果bash解释器不在/bin目录,那么脚本就无法执行,可以将解释器位置默认为 #! /use/bin/env bash
Shebang行不是必需的,但是缺少Shebang行时,执行脚本之前需要手动添加解释器的位置,将脚本传给解释器再执行
执行权限和路径
脚本执行的前提条件是,用户对于脚本需要有执行权限,给脚本赋予权限命令示例如下:
给所有用户执行权限 :chmod +x script.sh
给所有用户读取权限和执行权限 :chmod +rx script.sh chomd 755 script.sh
只给脚本拥有者读取权限和执行权限 :chmod u+rx script.sh
脚本的权限通常设置为755(拥有者有所有的权限,其他人有只读和执行权限),或者700(只有拥有者可以执行)。
除指定脚本权限外,脚本执行时还需要指定脚本的路径,可以将服务器的所有脚本统一放置,然后将目录添加到环境变量PATH中,这样的话执行时可以在任意目录下直接输入脚本名来运行脚本
mkdir ~/bin 在根目录下创建脚本文件夹
export PATH=$PATH:~/bin 将创建的脚本文件夹写入PATH环境变量
source ~/.bashrc 将新增的内容加入到~/.bashrc文件中,重新加载该文件配置(source .bashrc)即可生效
env命令
env命令总是只想/usr/bin/env文件,或者说该文件一直在目录/usr/bin中
#!/usr/bin/env name 可以让shell查找环境变量中指定name的命令的具体路径,例如:
/usr/bin/env bash
/usr/bin/env node
env的命令参数如下
不带环境变量启动 :-i ignore-environment
从环境变量中删除一个变量 :-u -unset=Name
显示帮助 :--help
输出版本信息 :--version
新建一个不带任何环境变量的shell env -i /bin/sh
注释
bash脚本中的注释 使用 #,可以放在行首,也可以放在行尾,一般可以放在脚本开头,解释说明当前脚本的作用
脚本参数
脚本执行调用时,可以在脚本之后以空格隔开的形式附带多个参数,在脚本内部使用固定参数接收格式来使用这些参数,例如,$1代表第一个参数,以此类推到$9,如果存在第十个参数可以使用${10}的方式
特殊变量如下:
$0 :脚本文件名
$1~$9 :对应脚本的第一个到第九个参数
$# :参数的总和
$@ :全部的参数,参数之间使用空格分隔
$* :全部的参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,也可以自定义分隔符
shift命令
shift命令可以移除脚本的第一个参数,如果在shift命令后加上整数数字如 shift X,则代表指定移除脚本的X个参数
getopts命令
getopts命令用在脚本的内部,用于解析复杂的脚本命令行参数,通常与while一起使用,取出脚本中所有带有前置连词线 - 的参数
getopts optstring name
optstring参数时字符串,给出脚本所有的连词线参数
在包含多个配置项的情况下,如 -l -h -a但是仅有-a可以设置参数值时,可以写成 lha 但是getopts规定,带有参数值的参数配置项后需要有 :,最终也就是lha:
name 用来保存取到的配置项参数,例如 l h a
配置项参数终止符
-和--开头的参数,会被bash当做配置项解释,但是有些不是配置项,而是实体参数的一部分,例如 -f --file
这个情况下使用配置项参数终止符,告诉bash,在它后面的参数开头的-和--并不是配置项参数中支符,而是实体参数
-- -f -- --file
如果需要确保某个变量不会被当做配置项解释,就要在它前面放上参数终止符,但是如果变量并不是真实存在的路径,被当做实体参数执行后,会报错
如果在文件内容搜索时,要搜索的内容包含--,那么实际命令运行的时候搜索的内容需要放在双引号中
exit命令
用于终止当前脚本的执行,并且向shell返回一个退出值
exit命令后可以跟参数,该参数就是退出状态
exit与return的区别是return是函数的退出,而exit是整个脚本的退出,如果在函数中调用exit则退出函数且同时终止脚本的执行。
命令执行结果
命令执行结束后,会有一个返回值,0表示执行成功,非0表示执行失败,$?可以读取前一个命令执行的返回值
source命令
source命令用于执行一个脚本,通常用于重新加载一个配置文件,source命令最大的特点就是在当前shell执行脚本时可以直接执行,不需要新建一个字shell,且不需要export变量
source命令的另一个用途,是在脚本内部加载外部库。在脚本中加载外部库,可以直接在当前脚本中使用外部库的函数
source有一个简写形式,可以使用一个.来表示,例如: . .bashrc (重新加载配置)
别名 alias命令
使用alias可以对命令设置别名,unalias commandname可以删除设置的别名,查看所有设置的别名,在命令行直接输入alias即可