shell脚本

变量

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值