参考地址
一、Bash脚本基础
记录编写脚本时的一些信息
1. Bash脚本定义变量
三种变量类型
-
局部变量:局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell启动的程序不能访问局部变量;
-
环境变量: 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量;
-
shell变量:shell 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量。
定义和使用变量
- 定义变量:
name=value,需要注意,等号两侧不能有空格 - 使用变量:
echo $name或者echo ${name} - 定义局部变量:
local name="test" - 定义只读变量:
readonly name - 删除变量:
unset name
Bash字符串
- 单引号:任何字符都会原样输出,里面的字符串变量是无效的,单引号字符串中不能出现单独一个的单引号,但可以成对出现,作为字符串拼接使用;
- 双引号:可以有变量并且可以出现转义字符
2. Bash脚本传递参数
Bash中的参数按照数字顺序定义
Bash脚本内获取参数的格式为:$n
几个特殊参数
$0: 文件名$#: 传递到脚本参数的个数$*: 以单个字符串显示所有向脚本传递的参数
数组
- 定义:
myArr = (value0,value1,value2) - 使用数组:
${数组名[下标]} - 获取数组所有元素:
${my_array[*]}或者${my_array[@]}可以获得数组的所有元素 - 获取数组长度:
${#array_name[@]} 或者 ${#array_name[*]}
运算符
算术运算符
| 运算符 | 说明 |
|---|---|
| + | 加法 |
| - | 减法 |
| * | 乘法 |
| / | 除法 |
| % | 取余 |
| = | 赋值 |
| == | 相等。用于比较两个数字,相同则返回 true。 |
| != | 不相等。用于比较两个数字,不相同则返回 true。 |
关系运算符
| 运算符 | 说明 |
|---|---|
| -eq | 检测两个数是否相等,相等返回 true。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回true |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回true |
布尔运算符
| 运算符 | 说明 | |
|---|---|---|
| ! | 非运算,表达式为 true 则返回 false,否则返 | 回 true。 |
| -o | 或运算,有一个表达式为 true 则返回 true。 | |
| -a | 与运算,两个表达式都为 true 才返回 true。 |
逻辑运算符
| 运算符 | 说明 | ||
|---|---|---|---|
| && | 逻辑的 AND | ||
| 逻辑的 OR |
字符串运算符
| 运算符 | 说明 |
|---|---|
| = | 检测两个字符串是否相等,相等返回 true。 |
| != | 检测两个字符串是否不相等,不相等返回 true。 |
| -z | 检测字符串长度是否为 0,为 0 返回 true。 |
| -n | 检测字符串长度是否不为 0,不为 0 返回 true。 |
| $ | 检测字符串是否为空,不为空返回 true。 |
文件测试运算符
| 运算符 | 说明 | ||
|---|---|---|---|
| -b file | 检测文件是否是块设备文件,如果是,则返回 | true。 | |
| -c file | 检测文件是否是字符设备文件,如果是,则返回 | true。 | |
| -d file | 检测文件是否是目录,如果是,则返回 true。 | ||
| -f file | 检测文件是否是普通文件(既不是目录,也不是 | 设备文件),如果是,则返回 true。 | |
| -g file | 检测文件是否设置了 SGID 位,如果是,则 | 返 | 回 true。 |
| -k file | 检测文件是否设置了粘着位(Sticky Bit), | 如果是,则返回 true。 | |
| -p file | 检测文件是否是有名管道,如果是,则返回 true | ||
| -u file | 检测文件是否设置了 SUID 位,如果是,则 | 返回 true。 | |
| -r file | 检测文件是否可读,如果是,则返回 true。 |
脚本流程控制
if
if condition
then
command1
command2
....
commandN
fi
if else
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else
if condition1
then
command2
elif condition2
then
command2
else
command
fi
for循环
for var item1 item2 ... itemN
do
command1
command2
...
commandN
done
while循环
while condition
do
command
done
特殊的While循环 - 无限循环
# 写法1
while:
do
command
done
# 写法2
while true
do
command
done
Until循环
until condition
do
command
done
Case(switch)控制
case 值 in
value1)
command1
command2
...
commandN
;;
value2)
command1
command2
...
commandN
;;
esac
跳出循环
- break
- continue
二、Bash脚本进阶
脚本输出
- 输出普通字符串
echo "it is Linux.CN" - 输出转义字符串
echo "\"it is Linux.CN\"" - 输出变量
echo "$name is best Linux Distro" - 输出换行符
echo -e "show me your code!\n",-e开启转义 - 输出命令执行结果
echo `date` - 格式化输出
| printf支持的格式字符 | 说明 | |
|---|---|---|
| \a | 警告字符,通常为 ASCII 的 BEL 字符 | |
| \b | 后退 | |
| \c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b 格式指示符控制下的参数字符串中有效),而且,任何 | 留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
| \f | 换页(formfeed) \n 换行 | |
| \r | 回车(Carriage return) \t 水平制表符 | |
| \v | 垂直制表符 | |
| \ | 一个字面上的反斜杠字符 | |
| \ddd | 表示 1 到 3 位数八进制值的字符。仅在格式字符串中有效 | |
| \0ddd | 表示 1 到 3 位的八进制值字符 |
脚本测试
数值测试
| 参数 | 说明 |
|---|---|
| -eq | 等于则为真 |
| -ne | 不等于则为真 |
| -gt | 大于则为真 |
| -ge | 大于等于则为真 |
| -lt | 小于则为真 |
| -le | 小于等于则为真 |
字符测试
| 参数 | 说明 |
|---|---|
| = | 等于则为真 |
| != | 不相等则为真 |
| -z | 字符串字符串的长度为零则为真 |
| -n | 字符串字符串的长度不为零则为真 |
文件测试
| 参数 | 说明 |
|---|---|
| -e 文件名 | 如果文件存在则为真 |
| -r 文件名 | 如果文件存在且可读则为真 |
| -w 文件名 | 如果文件存在且可写则为真 |
| -x 文件名 | 如果文件存在且可执行则为真 |
| -s 文件名 | 如果文件存在且至少有一个字符则为真 |
| -d 文件名 | 如果文件存在且为目录则为真 |
| -f 文件名 | 如果文件存在且为普通文件则为真 |
| -c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
| -b 文件名 | 如果文件存在且为块特殊文件则为真 |
bash 脚本函数
函数定义结构
[function] funname [()]
{
action;
[return int;]
}
其中:
function关键字可带可不带funcname根据实际需要定义return int根据需要定义
函数参数
- 调用函数时传递的参数可以在函数中以
$1、$2方式获取 - 使用
$1的方式获取参数仅可用于前 10 个参数,超出需要使用 $n 获取;
| 参数 | 说明 |
|---|---|
| $# | 传递到脚本或函数的参数个数 |
| $* | 以一个单字符串显示所有向脚本传递的参数 |
| $$ | 脚本运行的当前进程 ID 号 |
| $! | 后台运行的最后一个进程的 ID 号 |
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
| $- | 显示 Shell 使用的当前选项,与 set 命令功能相同。 |
| $? | 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。 |
脚本输出输入重定向
| 参数 | 说明 |
|---|---|
| command > file | 将输出重定向到 file。 |
| command < file | 将输入重定向到 file。 |
| command >> file | 将输出以追加的方式重定向到 file。 |
| n > file | 将文件描述符为 n 的文件重定向到 file。 |
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
| n >& m | 将输出文件 m 和 n 合并。 |
| n <& m | 将输入文件 m 和 n 合并。 |
| << tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
/dev/null 如果不希望看到输出,可以将输出重定向到 /dev/null
文件包含
# 写法1
. filename # 注意点号(.)和文件名之间有一空格
# 写法2
source filename
三、Base编写常用命令
- pwd 输出当前所有目录, -P输出当前所在命令,并展示所有的软连接指向
- sort 命令是用来对内容进行排序的,可以将文本、数字进行排序。
sort path/to/file对文件内容进行升序排列;sort --reverse path/to/file对文件内容进行降序排列;sort --ignore-case path/to/file对文件内容进行忽略大小写的升序排列;sort --numeric-sort path/to/file对文件内容进行按数字顺序排列;sort --unique path/to/file对文件内容进行唯一排列;
- echo
echo "message"输出信息;echo "my path is $PATH"输出包含有环境变量的信息;echo "Hello World" >> {{file.txt}}在文件尾部追加内容;echo "Hello World" > {{file.txt}}移除当前文件内容,并替换为新的内容。
- read
read $variable读入数据,并设置给变量;read -p "Enter your input here: " $variable展示提示,并读入数据,设置给变量;while read line; do echo "$line"; done按行读取内容,并执行命令。
- shift : shift num shift 后可以跟一个数字参数,表示移除相应数量的参数,其他参数向前移动。
四、Bash公共库
Bash Shell Function Libary
Bash Shell Function Library 是一个短小精炼的 Bash 公共库,他提供了诸如数组操作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量操作等功能,帮助运维工程师快速完成自己的脚本编写工作。
Bash Shell Function Library 是一个短小精炼的 Bash 公共库,他提供了诸如数组操作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量操作等功能,帮助运维工程师快速完成自己的脚本编写工作。
Bash lib
Bash Lib 是一个原子化的公共库,你可以根据自己的实际需要,引入所需的公共库分组, 使用相应的内容,降低整个项目的大小。 Bash Lib 提供了诸多原子库,你选择需要使用的引入即可:
- 参数处理:arg-utils
- 日历处理: calendar-utils
- 日期处理:date-utils
- Hash 处理:hash-utils
- 帮助处理:help-util
- 列表处理:list-utils
- 交互处理:prompt-colors
- 文字处理:text-utils
- 测试处理:test-utils
- 时间处理:time-utils
使用方法
从 github.com/aks/bash-li… 下载仓库,并选择你需要引入的脚本,复制到项目 目录下,并进行引用即可。
五、推荐阅读
- 如何入门 Bash 编程:linux.cn/article-132…
- 编写更好 Bash 脚本的 8 个建议:linux.cn/article-642…
- Linux 中高效编写 Bash 脚本的 10 个技巧:linux.cn/article-861…