[Linux]-shell的控制语句

目录

【if语句】

1.if语句的第一种形式

2.if语句的第二种形式

【case控制语句】

【for循环语句】

1.for循环第一种形式

2.for循环的第二种形式

【while循环语句】

【shell的函数】


【if语句】

shell脚本中的if语句基本的逻辑思想还是和C语言相同的,不同的只有语句的格式。

if语句的结束为fi,反过来。

1.if语句的第一种形式

注意

        if后添加一个空格,条件的左右均有一个空格。否则会出错

3119a4711e8844f886c4c8f5e29da9dc.png

检测当前目录下文件是否存在

echo "请输入文件名"
read fileName

if [ -e $fileName.txt ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi

检测当前目录下文件是否存在,不存在则创建

如果文件存在,打开文件。否则创建

echo "请输入文件名"
read fileName

if [ -e $fileName.txt ]; then
    #echo "文件存在"
    cat $fileName.txt
else
    #echo "文件不存在"
    touch $fileName.txt
fi

2.if语句的第二种形式

elif---->  eles if   ---->  elif

相当于C语言中的else if,并列的逻辑判断关系

24acf53fd4444f3993422776fabe3060.png

并列关系下的逻辑判断

#! /bin/bash

echo "请输入Yes Or No"
read option
if [ $option = "yes" ];then
    echo "选择了Yes"
elif [ $option = "no" ];then
    echo "选择了No"
else
    echo "其他选项"
fi

0ea72fbf372b4efa850c9bf0fb3bd44f.png

【case控制语句】

shell中的case语句判断,类比于C语言,似乎shell中的case可以判断多种类型,shell中的格式不包含switch,但是整体看还是和switch很类似的。

case的定义形式如下:

4230a71dbab3402a828c66905a76c80a.png

 case判断输入内容

#! /bin/bash


echo "请输入选项"
read option

case $option in
    "yes")
        echo "输入了Yes"
        ;;
    "no")
        echo "输入了No"
        ;;
    *)
        echo "输入了其他"
        exit 1
        echo "测试是否退出"
esac

da887b6171044059a8d28ca2629e74c2.png

【for循环语句】

shell中的for循环与C语言类似,只是定义形式会有所不同罢了。

1.for循环第一种形式

for循环的第一种定义形式如下

ba648f1537b54479a3697339e6b55d81.png

 for( i = 0; i < n ; i++)

{

        ....

}

与C语言的for循环进行对比后,是否会觉的很熟悉。初始值,限制值以及执行步阶是一一对应的。而do以及done对应两个大括号。

使用for循环来求和

 如果不使用declare -i 定义i为整型变量,可能会出现最后得出的sum的值为0+1+2+3+4..+100,似乎sum不是被看做整数,而是看为一个类似字符串的东西拼接?

#!/bin/bash

declare -i i=0
declare -i sum=0
for(( i=0 ; i<=100 ; i++ ))
do
    sum=$sum+$i
done
echo "sum为$sum"

d940330c017749069c5146572fa4fb03.png

2.for循环的第二种形式

for的第二种表达形式是之前没有见过的形式。拆分一下他的意思就是。在var分别为con1,con2,con3.....的时候执行程序段。do以及done依旧起到大括号的作用。

需要注意的是,在每个程序段如果要取对应var的值,需要给美金($var)

48fbc6fb2d0b4e05a2c47a0f4d6858aa.png

 利用for循环的第二种形式,配合反引号解析系统命令,做到扫描当前路径文件

反引号加上ls可以把当前路径下的文件名赋值给fileName 

#! /bin/bash

for fileName in `ls`
do
    echo "当前文件为:$fileName"
done

3dc53a712d384ab79ae040c32c8e1bb1.png

扫描路径下文件并分析文件类型

通过不断获得的文件名,通过条件测试中的字符串测试来判断文件的类型。

如下代码,如果扫描到目录文件,也就是文件夹。不会判断其他类型。如果扫描到为普通文件,则使用case语句进行类型判断(只用到了脚本文件和其他文件的判断,可以适当添加,可以扫描多种文件)。

#! /bin/bash


for fileName in `ls`
do
    if [ -d $fileName ];then
        echo "当前文件为:$fileName 是目录文件"
    elif [ -f $fileName ];then
        #echo "当前文件为:$fileName 是普通文件"
        case $fileName in
            *.sh)
                echo "$fileName 是普通文件的脚本文件"
                ;;
            *)
                echo "$fileName 是普通文件但不是脚本文件"
                

        esac
    fi
    
done

9aaba12c1f494aaaa703054e5a3c582d.png

【while循环语句】

shell中的while循环语句整体逻辑上类似于C语言,也只是定义形式不一样。并且shell中还有一种特殊的类似于while的循环语句。

while语句是条件满足则循环,而until语句是条件不满足才循环

如下添加箭头的位置都需要添加空格,否则会出错!

47c5da9e7a7d48c5a4ccc905d39d26ab.png

 fe66e00dc3044847b6cae894deec4414.png

【shell的函数】

shell的函数也是为了更好地封装性以及便利性以及防止shell命令的复用。shell中一般需要了解的是函数的传参以及定义形式。

shell的函数有两种形式:

一般默认使用的是格式一,格式二似乎指一种声明,可以省略。

需要注意的是,shell函数是没有返回值以及形参的

59d167b2a49c458eba76dd3ca48ca926.png

shell函数的封装

#! /bin/bash

declare -i temp
function my_add()
{
    temp=$1+$2
    return $temp
}

echo "请输入两个数字"
read num1 num2
my_add $num1 $num2
echo "得到的数字为:$?"

ba55cf75be4542aa9c70cda7977617cf.png

 同时使用如上方法进行求和似乎会有一个问题,那就是返回的接收的值只有一个字节的大小(也就是范围为0-255)。

401eb8339f5e4283958d4e4dba577277.png

 想要解决如上问题,可以使用Linux自带的计算器

#原本函数的返回

return $1+$2

#使用反引号解析系统命令

return `expr $1+$2 `

shell函数的跨文件调用

如何在一个脚本文件中调用另一个脚本文件中封装好的函数呢。使用source关键字

 如下代码

                15shell.sh封装了函数,在14shell.sh中调用

3e7417e66fb146c8b3fe94d8788985c3.png

 14shell.sh

#! /bin/bash

#导入15shell.sh的函数
source 15shell.sh


echo "请输入两个数字"
read num1 num2
my_add $num1 $num2
echo "得到的数字为:$?"

15shell.sh

#! /bin/bash
function my_add()
{
    return `expr $1 + $2`
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Leviiil

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

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

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

打赏作者

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

抵扣说明:

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

余额充值