阿里云藏经阁-Bash脚本基础

249 阅读6分钟

参考地址

Shell速查手册-阿里云开发者社区

一、Bash脚本基础

记录编写脚本时的一些信息

1. Bash脚本定义变量

三种变量类型

  1. 局部变量:局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell启动的程序不能访问局部变量;

  2. 环境变量: 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量;

  3. shell变量:shell 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量。

定义和使用变量

  1. 定义变量: name=value,需要注意,等号两侧不能有空格
  2. 使用变量:echo $name 或者 echo ${name}
  3. 定义局部变量: local name="test"
  4. 定义只读变量: readonly name
  5. 删除变量:unset name

Bash字符串

  1. 单引号:任何字符都会原样输出,里面的字符串变量是无效的,单引号字符串中不能出现单独一个的单引号,但可以成对出现,作为字符串拼接使用;
  2. 双引号:可以有变量并且可以出现转义字符

2. Bash脚本传递参数

Bash中的参数按照数字顺序定义

Bash脚本内获取参数的格式为:$n

几个特殊参数

  1. $0 : 文件名
  2. $# : 传递到脚本参数的个数
  3. $* : 以单个字符串显示所有向脚本传递的参数

数组

  1. 定义: myArr = (value0,value1,value2)
  2. 使用数组:${数组名[下标]}
  3. 获取数组所有元素: ${my_array[*]} 或者 ${my_array[@]}可以获得数组的所有元素
  4. 获取数组长度: ${#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)控制

casein
value1)
    command1
    command2
    ...
    commandN
    ;;
value2)
    command1
    command2
    ...
    commandN
    ;;
esac

跳出循环

  1. break
  2. continue

二、Bash脚本进阶

脚本输出

  1. 输出普通字符串 echo "it is Linux.CN"
  2. 输出转义字符串 echo "\"it is Linux.CN\""
  3. 输出变量 echo "$name is best Linux Distro"
  4. 输出换行符 echo -e "show me your code!\n" ,-e开启转义
  5. 输出命令执行结果 echo `date`
  6. 格式化输出
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;]
}

其中:

  1. function 关键字可带可不带
  2. funcname 根据实际需要定义
  3. return int 根据需要定义

函数参数

  1. 调用函数时传递的参数可以在函数中以$1$2方式获取
  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编写常用命令

  1. pwd 输出当前所有目录, -P输出当前所在命令,并展示所有的软连接指向
  2. 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 对文件内容进行唯一排列;
  3. echo
    • echo "message" 输出信息;
    • echo "my path is $PATH" 输出包含有环境变量的信息;
    • echo "Hello World" >> {{file.txt}} 在文件尾部追加内容;
    • echo "Hello World" > {{file.txt}} 移除当前文件内容,并替换为新的内容。
  4. read
    • read $variable 读入数据,并设置给变量;
    • read -p "Enter your input here: " $variable 展示提示,并读入数据,设置给变量;
    • while read line; do echo "$line"; done 按行读取内容,并执行命令。
  5. shift : shift num shift 后可以跟一个数字参数,表示移除相应数量的参数,其他参数向前移动。

四、Bash公共库

Bash Shell Function Libary

github.com/SkypLabs/bs…

Bash Shell Function Library 是一个短小精炼的 Bash 公共库,他提供了诸如数组操作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量操作等功能,帮助运维工程师快速完成自己的脚本编写工作。

Bash Shell Function Library 是一个短小精炼的 Bash 公共库,他提供了诸如数组操作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量操作等功能,帮助运维工程师快速完成自己的脚本编写工作。

Bash lib

项目地址:aks.github.io/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… 下载仓库,并选择你需要引入的脚本,复制到项目 目录下,并进行引用即可。

五、推荐阅读