流程控制
if判断
基本语法:
#写法一
if [ 条件判断式 ];then
程序
fi
#写法二
if [ 条件判断 ]
then
程序
fi
#写法三
if [ 条件判断 ]
then
程序
elif [ 条件判断式 ]
then 程序
else
程序
fi
代码实例:
#!/bin/bash
if [ $1 = "gxy" ]
then
echo "welcom to our family"
fi
#开始判断年龄
if [ $2 -ge 18 -a $2 -le 35 ]
then
echo "You are available!"
elif [ $2 -lt 18 ]
then
echo "You are too young!"
else
echo "You are fired!"
fi
算法中的-a 等价于 and ,同理 -o就等价于 or

case判断
基本语法:
case $变量名 in
"情况1")
执行对应程序
;;
"情况2")
执行对应程序
;;
*)
执行程序
;;
esac
代码示例:
#!/bin/bash
case $1 in
1)
echo "one"
;;
2)
echo "two"
;;
3)
echo "three"
;;
*)
echo "other"
;;
esac

for 循环
基本语法:写法一
for ((初始值;循环控制条件;变量变化))
do
程序
done
代码示例:
#!/bin/bash
for (( a=1; a <= $1 ;a++ ))
do
echo $a
done

注意:在双小括号(())中可以直接写数学表达式
写法二
for 变量 in 值1 值2 值三...
do
程序
done
代码示例:
#!/bin/bash
for i in {1..100}
do
sum=$[ $sum+$i ]
done
echo $sum

比较$*和$@区别
#!/bin/bash
echo '=======$*========'
for x in "$*"
do
echo $x
done
echo '=======$@========'
for x in "$@"
do
echo $x
done

while循环
基本语法:
while [ 条件表达式 ]
do
程序
done
代码示例:
#!/bin/bash
i=1
while [ $i -le $1 ]
do
sum=$[ $sum+$i ]
i=$[ $i + 1 ]
done
echo $sum

read 读取控制台输入
基本语法:read -p/-t 参数
-p:指定读取值时的提示符;
-t:指定读取值时的等待时间(秒),没有这个选项就会一直等待
#!/bin/bash
read -t 10 -p "pleasr input your name:" name
echo "welcome $name"

函数
系统函数
basename
输出脚本名称:basename 文件

其实质上就是字符串的一个剪切,basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来

利用basename去掉后缀:basename 文件 后缀

dirname
输出文件路径:dirname 文件

其本质还是字符串的截取
自定义函数
基本语法:
[function] 函数名 (参数) #可以不输入形参,直接用$1~$9替代
{
函数主体
}
必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值n(0-255)
代码实例:
#!/bin/bash
function add()
{
s=$[$1+$2]
echo “sum is:” $s
}
#参数从控制台读取
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
#调用函数
add $a $b

写法二:或者利用return返回值,注意return返回的数值只能是(0~255)
#!/bin/bash
function add()
{
s=$[$1+$2]
return $s
}
#参数从控制台读取
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
#调用函数
add $a $b
echo "和:"$?


写法三:系统函数的调用方式,做命令替换
#!/bin/bash
function add()
{
s=$[$1+$2]
echo $s
}
#参数从控制台读取
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
#调用函数
sum=$[add $a $b]
echo "和:" $sum
综合应用案例
归档文件:实际生产应用中,往往需要对重要数据进行归档备份。案例需求就是实现一个每天对指定目录(文件夹)归档备案的脚本,输入一个目录(末尾不带/ ),将目录下所有文件按天归档保存,并将归档日期加在归档文件名上,放在/root/archive下。
#!/bin/bash
#判断当前输入参数是否正确
if [ $# -ne 1 ]
then
echo "参数个数不正确!参数个数只能为1"
exit #直接退出脚本
fi
#若输入正确,从参数中获取目录名称
if [ -d $1 ]
then
#稍后截取目录
echo
else
echo
echo "目录不存在"
exit
fi
#提取文件夹名
DIR_NAME=$(basename $1)
# dirname $1是提取当前路径,然后cd进去,pwd是输出绝对路径,将绝对路径赋值给DIR_PATH
#为什么要提取绝对路径呢,因为在执行这个脚本的时候,不一定是在当前目录进来的
,为了在别的地方也能执行,所以要给出绝对路径,才能找到要打包的文件
DIR_PATH=$(cd $(dirname $1); pwd)
#获取当前日期
DATE=$(date +%y%m%d)
#定义生成归档文件名称,字符串拼接
FILENAME=archive_${DIR_NAME}_$DATE.tar.gz
#定义生成路径
FILEPATH=/root/archive/$FILENAME
#开始归档目录文件
echo "开始归档..."
tar -czf $FILEPATH $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$FILEPATH"
echo
else
echo "归档失败!"
fi
exit

