Linux学习—shell编程(二)

本文介绍了Bash脚本中的流程控制结构,包括if条件判断,case多情况判断,for和while循环,以及read命令用于读取用户输入。此外,还详细讲解了函数的使用,包括自定义函数和系统函数如basename和dirname。最后提供了一个归档文件的脚本案例,展示如何结合这些控制结构实现文件管理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流程控制

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 循环

  1. 基本语法:写法一

for ((初始值;循环控制条件;变量变化))
do
    程序
done

代码示例:

#!/bin/bash
for (( a=1; a <= $1 ;a++ ))
do
        echo $a
done

注意:在双小括号(())中可以直接写数学表达式

  1. 写法二

for 变量 in 值1 值2 值三...
do 
    程序
done

代码示例:

#!/bin/bash
for i in {1..100}
do
        sum=$[ $sum+$i ]
done
echo $sum
  1. 比较$*和$@区别

#!/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

  1. 输出脚本名称:basename 文件

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

  1. 利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值