declare -A asso_array1
declare -A asso_array2
declare -A asso_array3
相关字段参数
# 数组名[索引or下标]=变量值
asso_array1[linux]=one
asso_array1[java]=two
asso_array1[php]=three
asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss Hou")
declare -A asso_array1='([php]="three" [java]="two" [linux]="one")'
declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss Hou")'
declare -A | egrep "asso_array[12]"
echo ${asso_array1[linux]} # 获取索引为liunx的值
one
echo ${asso_array1[*]} # 获取数组值
three two one
echo ${!asso_array1[*]} # 获取数组索引
php java linux
echo ${#asso_array1[*]} # 获取数组元素个数
3
declare -A books
declare -A | grep books
let books[linux]++
declare -A | grep books
条件判断
句子格式
判断[]和[[]]中的变量需要加双冒号
1.确定文件类型
判断参数
意义
-e
确定文件是否存在(任何类型的文件)
-F
判断文件是否存在并且是普通文件
-d
判断文件是否存在并且是目录
-L
判断文件是否存在且是软链接文件
-b
判断文件是否存在并且是块设备文件
-S
判断文件是否存在并且是套接字文件
-C
判断文件是否存在并且是字符设备文件
-p
确定文件是否存在并且是命名管道文件
-s
判断文件是否存在且为非空文件(有内容)
与其他判断条件结合,则表示否定
例如
test -e file # 只要文件存在条件为真
[ -d /shell01/dir1 ] # 判断目录是否存在,存在条件为真
[ ! -d /shell01/dir1 ] # 判断目录是否存在,不存在条件为真
[[ -f /shell01/1.sh ]] # 判断文件是否存在,并且是一个普通的文件
2.确定文件权限
判断参数
意义
-r
当前用户是否可以读取
-w
当前用户是否可以写入
-X
当前用户是否可以执行
-u
是否有suid、中级权限风险位
-G
是否sgid、中级权限强制位
-k
是否有位,中间权限粘性位
3.判断文件是新的还是旧的
说明:这里的old和new指的是文件的更改时间
判断参数
意义
文件1-nt文件2
比较file1是否比file2新
文件1-ot文件2
比较file1是否比file2旧
文件1-ef文件2
比较是否是同一个文件,或者用来判断硬链接是否指向同一个inode
4、判断值
[] 和 test 中使用的比较符号
(()) 和 [[]] 中使用的比较符号
意义
-eq
==或=
平等的
-ne
!=
范围
-gt
少于
-lt
小于或等于
-le
=!=物理符号
要在[]中使用物理比较符号,需要添加传送符号
[ 1 > 2 ] && echo yes || echo no
5.确定字符串
判断参数
意义
-z
判断是否为空字符串,如果字符串宽度为0php遍历字符串,则创建
-n
判断是否为非空字符串,如果字符串宽度不为0,则创建
字符串1=字符串2
检查字符串是否相等
字符串1!=字符串2
检查字符串是否相等
6. 逻辑运算符
[] 和 test 中使用的运算符
[[ ]] 和 (()) 中使用的运算符
意义
例子
-A
&&
与
[1-eq1-a1-ne0][1-eq1]&&[1-ne0]
-o
||
或者,或者
[1-eq1-o1-ne1]
不是这样的
[!1-eq1]
例如
[ $(id -u) -eq 0 ] && echo "the user is admin"
[ $(id -u) -ne 0 ] && echo "the user is not admin"
[ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"
uid=`id -u`
test $uid -eq 0 && echo this is admin
[ $(id -u) -ne 0 ] || echo this is admin
[ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin
[ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin
[[ 1 -eq 1 && 1 -ne 0 ]] && echo yes || echo no # yes
[[ ! 1 -eq 1 && 1 -ne 0 ]] && echo yes || echo no # no
# 注意:在(( ))中,=表示赋值;==表示判断
((1==2));echo $?
((1=1));echo $?
((2!=1));echo $?
((`id -u`==0));echo $?
((a=123));echo $a
unset a
((a==123));echo $?
# 注意:双引号引起来,看作一个整体;= 和 == 在 [ 字符串 ] 比较中都表示判断
a='hello world';b=world
[ $a = $b ];echo $?
[ "$a" = "$b" ];echo $?
[ "$a" != "$b" ];echo $?
[ "$a" == "$b" ];echo $?
test "$a" != "$b";echo $?
test -z $a;echo $?
a=hello
test -z $a;echo $?
test -n $a;echo $?
test -n "$a";echo $?
[ '' = $a ];echo $?
[[ '' = $a ]];echo $?
[ 1 -eq 0 -a 1 -ne 0 ];echo $?
[ 1 -eq 0 && 1 -ne 0 ];echo $?
[[ 1 -eq 0 && 1 -ne 0 ]];echo $?
判断语句1.if结构
if [ condition ];then
command
command
fi
if test 条件;then
命令
fi
if [[ 条件 ]];then
命令
fi
[ 条件 ] && command
2.if...else结构
if [ condition ];then
command1
else
command2
fi
[ 条件 ] && command1 || command2
3.if...elif...else结构
if [ condition1 ];then
command1
elif [ condition2 ];then
command2
else
command3
fi
4.if嵌套结构
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
5.案例句
case为多个匹配语句,如果匹配成功,则执行匹配命令
句子的结构
# 说明:pattern表示需要匹配的模式
case var in # 定义变量;var代表是变量名
pattern 1) # 模式1;用 | 分割多个模式,相当于or
command1 # 需要执行的语句
;; # 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) # default,不满足以上模式,默认执行*)下面的语句
command4
;;
esac # esac表示case语句结束
应用领域
# 脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作
#!/bin/env bash
read -p "请输入你要管理的服务名称(vsftpd):" service
case $service in
vsftpd|ftp)
read -p "请选择你需要做的事情(restart|stop):" action
case $action in
stop|S)
service vsftpd stop &>/dev/null && echo "该$serivce服务已经停止成功"
;;
start)
service vsftpd start &>/dev/null && echo "该$serivce服务已经成功启动"
;;
esac
;;
httpd|apache)
echo "apache hello world"
;;
*)
echo "请输入你要管理的服务名称"
;;
esac
用于执行一组命令已知次数
1)列表循环
for variable in {list}
do
command
command
…
done
# 或者
for variable in a b c
do
command
command
done
for var in {1..10};do echo $var;done
for var in 1 2 3 4 5;do echo $var;done
for var in `seq 10`;do echo $var;done
for var in {0..10..2};do echo $var;done
for var in {2..10..2};do echo $var;done
for var in {10..1};do echo $var;done
for var in {10..1..-2};do echo $var;done
for var in `seq 10 -2 1`;do echo $var;done
2)C型循环
for(( expr1; expr2; expr3 ))
do
command
command
…
done
# expr1:定义变量并赋初值
# expr2:决定是否进行循环(条件)
# expr3:决定循环变量如何改变,决定循环什么时候退出
for (( i=1;i<=5;i++))
do
echo $i
done
for ((i=2;i<=10;i+=2));do echo $i;done
# 计算1-100奇数和
sum=0
for i in {1..100..2}
do
sum=$[$i+$sum]
done
echo "1-100的奇数和为:$sum"
# 或者
sum=0
for ((i=1;i<=100;i+=2))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"
2. while 循环
如果条件为 true 则进入循环,如果条件为 false 则退出循环
while 表达式
do
command...
done
# 或者
while [ $i -eq 1 ] 或者 (( $i == 1 ))
do
command
command
...
done
# 循环打印1-5数字
i=1
while (($i<=5))
do
echo $i
let i++
done
# 计算1-50偶数和
sum=0
i=2
while [ $i -le 50 ]
do
let sum=sum+i
let i+=2
done
echo "1-50的偶数和为:$sum"
3.直到循环
如果条件为假则进入循环,如果条件为真则退出循环
until expression
do
command
command
...
done
# 打印1-5数字
i=1
until [ $i -gt 5 ]
do
echo $i
let i++
done
4.循环控制
循环体:do....done 之间的内容
5.循环嵌套
循环体包含另一个完整的循环结构,称为循环嵌套
每次外循环都会触发内循环,直到内循环完成后才会执行下一个外循环。
for 循环、while 循环和until 循环可以相互嵌套
# 打印九九乘法表
# Y轴:循环9次,打印9行空行
# X轴:循环次数和Y轴相关;打印的是X和Y轴乘积 $[] $(())
# for循环
for ((y=1;y<=9;y++))
do
for ((x=1;x<=$y;x++))
do
echo -ne "$x*$y=$[$x*$y]t"
done
echo
echo
done
# while循环
y=1
while [ $y -le 9 ]
do
x=1
while [ $x -le $y ]
do
echo -ne "$x*$y=$[$x*$y]t"
let x++
done
echo
echo
let y++
done
# until循环
y=1
until [ $y -gt 9 ]
do
x=1
until [ $x -gt $y ]
do
echo -ne "$x*$y=$[ $x*$y ]t"
let x++
done
echo
echo
let y++
done
函数 1. 函数定义
# 方法1
函数名(){
函数体(一堆命令的集合,来实现某个功能)
return
}
# 方法2
function 函数名(){
函数体(一堆命令的集合,来实现某个功能)
echo hello
echo world
return
}
函数中可以定义位置参数,如$1、$2等php遍历字符串,调用函数时可以传入位置参数。
函数中可以使用local关键字来定义局部变量
函数中的return可以结束一个函数,return默认返回函数中最后一个命令状态值,也可以给出参数值,范围是0到256
2. 函数调用
#!/bin/bash
# 打印菜单
menu(){
cat <<-END
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
END
}
menu # 调用函数
cat func.sh # 函数有入参,用$1 $2 ...表示
#!/bin/bash
hello(){
echo "hello args is $1 and $2"
hostname
}
source func.sh # or
. func.sh
hello my world
# vim ~/.bashrc
文件中增加如下内容:
hello(){
echo "hello $1"
hostname
}
# 用户打开bash后可以直接使用该函数