Linux笔记 | Shell编程(中)


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿林仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值