Bash 脚本基础
定义变量
定义变量:name=value 需要注意,等号两侧不能有空格;
定义局部变量:local name=value;
定义只读变量:readonly name;
删除变量:unset name。
定义数组
定义数组:
myArray=(value0 value1 value2)
使用数组:
${数组名[下标]}
获取数组所有元素:
${数组名[*]} 或者
${数组名[@]}
获取数组长度
${#array_name[@]} 或者
${#array_name[*]}
运算符
关系运算符
-eq 检测两个数是否相等,相等返回true;
-ne 检测两个数是否不想等,不相等返回true;
-ge 检测左边的数是否大于右边的,如果是,则返回true;
字符串运算符
= 检测两个字符串是否相等,相等返回true;
!= 检测两个字符串是否不相等,不相等返回true;
-z 检测字符串长度是否为0,为0返回true;
-n 检测字符串长度是否不为0,不为0,则返回true;
$ 检测字符串是否为空,不为空返回true。
脚本控制流程
if 控制
if condition
then
command;
fi
if else 控制
if condition
then
command;
else
command;
fi
if-else-if-else控制
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
For循环
for var in item1..itemN
do
command
done
While循环
while condition
do
command
done
Until循环
until condition
do
command
done
Case(Switch)控制
case 值 in
value1)
command1
;;
value2)
command2
;;
esac
Bash 脚本进阶
定义函数
[function] funname [()]
{
action;
[return int;]
}
其中
- funtion 关键词可带可不带;
- funname 根据实际需要定义;
- return int 根据需要加入。
函数参数
- 调用函数传递的参数可以在函数中以 $1的方式获取;
- 使用$1的方式仅可用于前10个参数;
特殊参数
- $0 文件名;
- $# 传递到脚本和函数的参数个数;
- $* 以一个单字符串显示所有向脚本传递的参数;
- $$ 脚本允许的当前进程ID号;
- $? 显示最后命令退出状态,0表示没有错误,其他任何值表明有错误。
文件包含
文件包含
# 写法1
. filename # 注意点号和文件名中间有空格
# 写法2
source filename
Base 脚本编写常用命令
以下是编写Bash脚本的常用命令,你可以根据自己的需要进行选择。
sort
sort 命令是用例对内容进行排序的,可以将文本、数字进行排序。
- sort path/to/file 对文件内容进行升序排序;
- sort --unique path/to/file 对文件内容进行唯一排序;
echo
echo 命令是用来输出内容的。
- echo “my path is $PATH” 输出包含环境变量的信息;
- echo “hello world” >> {{file.txt}} 在文件尾部追加内容;
read
read 命令是用来获取用户输入内容,即标准输入设备(键盘)输入的内容。
-
read -a arrayname 把单词清单读入arrayname的数组里;
-
read -p “Enter your input here:\n” $variable 提示,并读入数据设置给变量;
-
while read line;do echo “$line”;done 按行读取内容,并执行命令;
mapfile
从标准输入读取行并赋值到数组。
-t 表示移除尾随行分隔符,默认是换行符
既然是读取标准输入,常见的就有以下几种读取形式:
$ mapfile myarr <alpha.log # 1.输入重定向
$ mapfile myarr < <(cat alpha.log) # 2.进程替换
shift
shift 命令可以用于将函数得参数移除,其他参数向前移动。
getopts
getopts 命令是一个内置变量,一般用在循环中。每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。比如:
while getopts ":co" opt; do
case "$opt" in
"c")
echo "command1"
;;
"o")
echo "command2"
;;
"*")
echo "other command"
;;
esac
done
sed
基本用法:sed + 选项 + “指令” 文件
-i 表示直接对内容进行修改,不加 i 时默认只是预览,不会对文件进行实际修改
-n 表示取消默认输出,sed默认会输出所有文本内容,使用 -n 参数后只显示处理过的行
--打印1到5行
sed -n '1,5p' 1.txt
other
${variable:?} 表示检验变量是否为空
eval也可以用于回显简单变量,不一定时复杂变量。如 test.txt内容:hello shell world!
myfile="cat test.txt"
eval echo $myfile #result:hello shell world!
Base 脚本调试
1、启用 Shell 脚本调试模式的方法
下面是主要的 Shell 脚本调试选项:
-v
(verbose 的简称) - 告诉 Shell 读取脚本时显示所有行,激活详细模式。-n
(noexec 或 no ecxecution 简称) - 指示 Shell 读取所有命令然而不执行它们,这个选项激活语法检查模式。-x
(xtrace 或 execution trace 简称) - 告诉 Shell 在终端显示所有执行的命令和它们的参数。 这个选项是启用 Shell 跟踪模式。
第一个机制是改变 Shell 脚本首行,如下,这会启动脚本调试。
#!/bin/sh 选项
其中, 选项可以是上面提到的一个或多个调试选项。
第二个是使用如下调试选项启动 Shell,这个方法也会打开整个脚本调试。
$ shell 选项 参数1 ... 参数N
第三个方法是使用内置命令 set
去调试一个给定的 Shell 脚本部分,如一个函数。这个机制是重要的,因为它让我们可以去调试任何一段 Shell 脚本。
启用调试模式:
$ set -选项
禁用调试模式:
$ set +选项
比如:
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
if [ "$UID" -eq "$ROOT_ID" ]; then
echo "You are not allowed to execute this program!"
exit 1;
fi
}
#turning on and off debugging of check_root function
set -x ; check_root; set +x ;