变量
1. 变量名=变量值
注意:=两边无空格
2. 交互式
read -p "提示信息" 变量名
数组
数组语法
数组名称=(元素1 元素2 元素3)
array=(1 4 8 9)
数组读出
${数组名称[索引]} 索引从0开始
${array[0]}
数组赋值
array[1]=8
访问数组:
echo ${array[0]} 访问第一个元素
echo ${array[@]} 访问全部元素echo ${array[*]}
echo ${#array[@]} 统计个数
echo ${!array[@]} 获取数组索引
echo ${array[@]:1} 从索引1开始
echo ${array[@]:1:2} 从索引1开始后面两个
关联数组:字典
第一种 先声明
declare -A ass #声明关联数组
ass["name"]="jack"
ass["age"]=28
echo ${ass["name"]}
第二种直接创建
bb=(["sex"]="m" ["name"]="tom")
echo ${bb["sex"]}
运算
注意:赋值等号两边无空格
n=$((2+3))
n=$[2+3]
let n=2+3
n=expr 2+3
条件判断语法结构
1. test 表达式
2. [ 表达式 ]
3. [[ 表达式 ]] 支持正则
4. (( 表达式 )) 类C风格数值判断
注意:括号里面的两端都有空格
test 3 -gt 2
[ 3 -gt 2]
[[ 3 -lt 2 ]]
(( 2<=3 ))
条件判断的参数 (man test)
判断文件类型
-e 文件存在
-f 存在且是普通文件
-d 存在且是目录
-L 软连接
file1 -ef file2 相同文件
例子:
test -e file
[ -e file ]
[ a.sh -ef b.sh ]
文件权限判断
-w 写
-r 读
-x 执行
例子:
test -r file
[ -r file ]
判断整数
-eq 等
-ne 不等
-gt 大
-lt 小
-ge 大于等于
-le 小于等于
判断字符串
-z 字符空
-n 字符非空
string1 = string2 等
string1 != string2 不等
例子
[ -z "" ];echo $?
[ -n "a" ];echo $?
[ "a" = "a" ];echo $?
[ "a" != "b" ];echo $?
多重条件判断
-a,&& 逻辑与
-o,|| 逻辑或
例子:
[ 1 -eq 1 ] && [ 1 -ne 0 ]
[ 1 -eq 1 -a 1 -ne 0 ]
[ 1 -eq 1 ] || [ 1 -ne 0 ]
[ 1 -eq 1 -o 1 -ne 0 ]
类C风格数值判断:双括号
双小括号里的=是赋值,==是判断
(( 1 == 1 ));echo $?
(( 1 != 1 ));echo $?
字符串比较
注意:双引号引起来,看作一个整体;=和== 在中括号[ 字符串比较 ] 中都表示判断
a=“hello”;b=“world”;
[ $a = $b ];echo
?
注
意
:
=
两
边
要
有
空
格
,
才
是
判
断
,
不
然
就
是
赋
值
了
状
态
码
:
? 注意:=两边要有空格,才是判断,不然就是赋值了 状态码:
?注意:=两边要有空格,才是判断,不然就是赋值了状态码:?为0代表执行成功
逻辑运算符总结
1. test expr1
2. [ expr1 ]
3. [[ expr1 ]]
条件判断
-d
-f
-e
-n
-z
-s 文件非空 [ -s file ] ,判断文件为空则加一个感叹号 [ ! -s file ]
流程控制
if elif else fi结构
if [ condition ]
then command
elif [ condition ]
then command
else command
fi
例子1:
#!/usr/bin/env bash
read -p "请输入:" str
if [ "$str" = "hello" ];then
echo "输入的是hello"
else
echo "不是hello"
fi
例子2:
#!/usr/bin/env bash
#需要传1个参
if [ "$1" = "hello" ];then
echo "参数是hello"
elif [ -z $1 ];then
echo "参数是空"
else
echo "不是hello"
fi
例子3:
#!/usr/bin/env bash
# 该脚本判断主机和远程主机是否互通
read -p "输入要ping的主机ip:" ip
ping -c1 $ip &> /dev/null # /dev/null是指结果不输出
if [ $? -eq 0 ];then
echo "hutong"
else
echo "butong"
fi
例子4:
#!/usr/bin/env bash
# 判断门户网站是否正常提供服务
# wget curl elinks
server=www.baidu.com
curl $server &> /dev/null
[ $? -eq 0 ] && echo "网站ok" || echo "网站不ok"
例子5:
备份数据库
mysql_dump=/usr/local/mysql/bin/mysqldump
user=root
pass=""
data=test
backup_dir=backup
dates=$(date +%F)
backup_path=$backup_dir/$dates
test -d $backup_path || mkdir -p $backup_path
if [ $? -eq 0 ];then
echo "backup starts ..."
$mysql_dump -u $user -p $pass -B $data > $backup_path/mysql_db.sql
if [ $? -eq 0 ];then
echo "backup done ..."
fi
fi
例子6:
磁盘使用率
disk_use_percentage=$(df -h | grep "/$" | awk '{print $(NF-1)}' | awk -F '%' '{print $1}')
例子7:
内存使用率
#!/usr/bin/env bash
mem_total=$(free -m|grep "^M"|awk '{print $2}')
mem_use=$(free -m|grep "^M"|awk '{print $3}')
mem_ratio=$((100*$mem_use/mem_total))
echo mem_ratio
case判断语句
#!/usr/bin/env bash
read -p "你输入的数字:" num
case $num in
1)
echo "input is 1"
;;
2)
echo "input is 2"
;;
*)
echo "input is not 1 or 2"
esac
for循环结构
for variable in {list}
do
command
done
或者
for variable in a b c
do
command
done
for (( i=0;i<=5;i++))
do
command
done
例子:
for i in {1..6}
for i in 1 2 3 4 5
for i in $(seq 6) 循环1到6
for i in $(seq 10 -2 1) 循环10到1,步长2
for i in $(ls *.sh)
for (( i=1;i<=5;i++))
例子:奇数求和
#!/usr/bin/env bash
sum=0
for ((i=1;i<=10;i++))
do
if (( $i%2 == 1 ));then
#let sum=$sum+$i
#sum=$[$sum+$i]
sum=$(($sum+$i))
else
continue
fi
done
echo "1-10的奇数和为:$sum"
break continue exit
continue 结束本次
break 结束整个循环
exit 结束整个程序
#!/usr/bin/env bash
# 执行exit后,最后的echo不执行
for i in {1..6}
do
if [ $i -eq 3 ];then
exit
else
touch file$i
fi
done
echo "touched $i"
while循环
i=0
while (($1<=5))
#while [ $i -le 5 ]
#while test $i -le 5
do
echo $i
let i+=1
#i=$(($i+1))
#i=$[$i+1]
done
while true #可以无限循环,或者while :
do
done
格式化输出
echo -n 不换行
echo -e "\a\n\b\t" 后面代表特殊意义
echo -e "\033[40;37m dada \033[0m" 颜色
shell交互
read
-p 打印
-t 限定输入时间
-s 不回显输入内容
-n 限定输入字符数
read -s -n6 -t5 -p "password: " password;echo $password