文章目录
01 条件判断
1.1 比较判断
基本语法:test condition
或 [ condition ]
- 注意condition前后需要有空格
- 例如:
[ $a = hello ]
注意等号两边要有空格 - shell中1表示false,0表示true
[ ]
表示false,即1
>
输出重定向
<
输入重定向
-
字符串判断是否相等:
=
-
字符串判断是否不等:
!=
-
数值判断:
等于-eq
不等于-ne
小于-lt
小等于-le
大于-gt
大等于-ge
案例:判断2是否小于8
[ 2 -lt 8 ]
echo $? # 查看结果 输出为0 表示true
1.2 文件权限判断
判断是否有读的权限-r xxx
判断是否有写的权限-w xxx
判断是否有执行的权限-x xxx
示例:
[ -r hello.sh ] # 判断hello.sh这个文件是否有可读的权限
$? # 输出0 表示true
1.3 文件类型判断
判断文件是否存在-e xxx
判断文件存在且为一个常规文件-f xxx
判断文件存在且为一个目录-d xxx
示例:
[ -e /root/hello.sh ]
$? # 输出0
[ -d /root/hello.sh ]
$? # 输出1
1.4 多条件判断
与:&&
前一条命令执行成功(true,0),执行后一条命令
或:||
前一条命令执行失败(false,1),执行后一条命令
示例:
a=15
[ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20"
# 输出:15 < 20
# 等价java命令:15 < 20 ? sout("15 < 20") : sout("15 >= 20");
02 流程控制
2.1 if判断
- 单分支
# 单分支
if [ 25 -gt 20 ];then
echo OK
fi
# 防止null的写法
if [ "$1"x = "abc"x ];then
echo OK
fi
# 多重条件
if [ ... ] && [ ... ];then
echo OK
fi
# 等价
if [ ... -a ... ];then
echo OK # -a表示&& -o表示||
fi
- 多分支
# 双分支
if [ $1 -lt 18 ];then
echo YES
else
echo NO
fi
# 多分支
if [ $1 -lt 18 ];then
echo YES
elif [ $1 -lt 35 ];then
echo GOOD
else
echo NO
fi
2.2 case语句
# 输入一个值 判断等于哪个值
case $1 in
1)
echo "one"
;;
2)
echo "two"
;;
3)
echo "three"
;;
*)
echo "number else"
;;
esac
2.3 for循环
# 括号中分别是:初始值 循环条件 变量变化
for((i = 0; i < $1; i++))
do
sum=$[$sum + $i]
done
echo $sum
# 另一种for循环写法
for os in linux winsows macos
do
echo $os
done
# 使用{}
for i in {1..100}
do
sum=$[$sum + $i]
done
echo $sum
对比$*和$@,使用引号才能看出区别
# 输出a b c(一行)
for p in "$*"
do
echo $p
done
# 输出a b c(三行)
for p in "$@"
do
echo $p
done
2.4 while循环
# 方式一(经典写法)
a=1
while [ $a -le $1 ]
do
sum=$[$sum + $a]
a=$[$a + 1]
while
# 方式二(扩展写法)
a=1
while [ $a -le $1 ]
do
let sum+=a
let a++
while
03 函数
3.1 系统函数
# 示例 使用$(...)调用函数 其中的+%s是参数
var="$1"_log_$(date +%s)
echo $var
basename
函数,用于取路径中的文件名称
basename /root/temp/abc.txt # 返回abc.txt
basename /root/temp/abc.txt .txt # 去除了.txt后缀 返回abc
# 在bash文件中使用该函数
echo script name: $(basename $0 .sh) # $0是文件全路径名
dirname
函数,用于获取文件路径名
dirname /root/temp/abc.txt # 返回/root/temp
dirname ../temp/abc.txt # 返回../temp
# 在bash文件中使用该函数
cd $(dirname $0) # 切换到脚本所在路径
echo script path:$(pwd)
# 或者
echo script path:$(cd $(dirname $0); pwd)
3.2 自定义函数
函数声明须在调用之前
函数返回值通过$?
系统变量获取,可显式使用return
,否则使用最后一条命令的运行结果,return
返回值只能是数值n(0~255)
#!/bin/bash
# 声明一个函数
function add(){
s=$[$1 + $2]
echo "sum is "$s
}
read -p "pls input a int:" a
read -p "pls input another int:" b
# 调用函数
add $a $b
有返回值的写法
#!/bin/bash
# 声明一个函数
function add(){
s=$[$1 + $2]
echo $s # 最后一行的内容即视为返回值
}
read -p "pls input a int:" a
read -p "pls input another int:" b
# 调用函数
sum=$(add $a $b) # 取返回值的写法
echo "sum is "$sum
04 综合运用案例 - 文件归档
- 需求
实现一个每天对指定目录归档备份,输入一个目录名称(末尾无/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下。归档命令:tar。
#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数数量不合法 只能有1个参数作为归档目录"
exit # 退出脚本
fi
# 判断目录是否存在
if !([ -d $1 ]) # 使用!(...)取非
then
echo "目录不存在"
exit
fi
# 获取当前日期
DATE=$(date +%y%m%d)
# 获取要归档的目录名及绝对路径
DIR_NAME=$(basename $1) # 获取要归档的目录(不以/结尾)
DIR_PATH=$(cd $(dirname $1); pwd) # 获取目录绝对路径
# 设置生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz # 此处的{}可省略 这里为了提升可读性
DEST=/root/archive/$FILE # 全路径名
# 执行归档操作
echo "开始归档..."
tar -czf $DEST $DIR_PATH/$DIR_NAME
# 判断是否执行成功并输出提示语句
if [ $? -eq 0 ]
then
echo "归档成功"
echo "归档文件为:$DEST"
else
echo "归档出现问题"
fi