草庐IT

Shell脚本之——条件语句if详解

Zcien 2023-05-01 原文

文章目录

一、test命令

1.2、格式

测试表达式是否成立,若成立返回0,否则返回其他数值。

格式1:    test 条件表达式
格式2:    [ 条件表达式 ]

1.2、实例操作

二、文件测试

2.1、格式:

操作符 文件名或者目录名 

2.2、常用的测试操作符

-d∶ 测试是否为目录(Directory)
-e∶ 测试目录或文件是否存在(Exist)
-f∶ 测试是否为文件(File)
-r∶ 测试当前用户是否有权限读取(Read)
-w∶ 测试当前用户是否有权限写入(Write)
-x∶测试当前用户是否有权限执行(eXcute)
-L∶测试是否为软链接文件

2.3、实例操作


三、整数值比较

3.1、格式

[ 整数1 操作符 整数2 ]

3.2、常用的测试操作符

-eq∶ 等于(Equal)
-ne∶ 不等于(Not Equal)
-gt∶ 大于(Greater Than)
-lt∶ 小于(Lesser Than)
-le∶ 小于或等于(Lesser or Equal)·
-ge∶ 大于或等于(Greater or Equal)

3.3、实例操作

1 结合逻辑与进行查询当前目录下的文件数目

2 查看系统内存是否低于或者高于1024M,如果满足条件则提示

3 使用双括号加数字进行表示

四、字符串比较

4.1、格式

[ 字符串1 = 字符串2 ]             #判断是否相等
[ 字符串1 != 字符串2 ]            #判断是否不等[ -z 字符串 ]                            #是否空值[ -n 字符串 ]                            # 字符集是否存在

4.2、常用的测试操作符

  • =∶ 字符串内容相同
  • !=∶ 字符串内容不同,!号表示相反的意思
  • z∶字符串内容为空

4.3、实例操作


五、逻辑测试(三元运算符)

5.1、格式

格式1∶    [ 表达式1 ] 操作符 [ 表达式2 ]…
格式2∶    命令1 操作符 命令2…

5.2、常用的测试操作符

  • -a或&&∶ 逻辑与,"而且"的意思
  • -o或||∶ 逻辑或,"或者"的意思
  • !∶逻辑否

5.3、实例操作一

5.4、实例操作二

#!/bin/bash
#Ping test
 
ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 is online!" || echo "$1 is offline!"

六、if语句

6.1、单分支结构

如果只有一个判断式要进行,那么我们可以使用单分支的if语句

6.1.1 格式

if [ 条件判断式 ]; then
    当条件判断成立时,可以进行的命令工作内容
fi                  #这里将if反过来写,结束if语句的意思

6.1.2 原理图:

6.1.3 实例操作

6.2、双分支结构

在同一个数据的判断中,如果该数据需要进行两种不同的判断,我们就需要双分支if语句了:

6.2.1 格式

if [ 条件判断式 ]; then
    当条件判断成立时,可以进行的命令工作内容
else   
    当条件判断不成立时,可以进行的命令工作内容
fi 

6.2.2 原理图:

6.2.3 实例操作一

6.2.4 实例操作二

#!/bin/bash
#Shut down httpd service
 
netstat -natp | grep :80 &> /dev/null
 
if [ $? -eq 0 ];then
   echo "httpd 服务正常运行!"
else
   echo "httpd 服务未开启,正在开启服务......"
   systemctl start httpd && echo "httpd 服务启动成功"
fi


6.3、多分支结构

如果数据需要进行多种不同的判断,则可以使用多分支结构

6.3.1 格式

if [ 条件判断式 ]; then
    当条件判断成立时,可以进行的命令工作内容
elif [ 条件判断式二 ]; then
    当条件判断成立时,可以进行的命令工作内容
else   
    当上面的条件判断都不成立时,可以进行的命令工作内容
fi     

6.3.2 原理图:

6.3.3 实例操作


七、case语句结构

7.1、格式

case 变量名称 in
“第一个变量内容”
    程序段
    ;;
“第二个变量内容”
    程序段
    ;;
*)
    不包含第一个变量内容与第二个变量内容的其他程序执行段
    默认程序段
    ;;
esac       

7.2、实例操作一

#!/bin/bash
#Determine grades and scores
 
read -p "请输入你的分数(0-100):" score
 
[ $score -ge 90 -a $score -le 100 ] && a="great"
[ $score -ge 70 -a $score -le 89 ] && a="medium"
[ $score -ge 60 -a $score -le 69 ] && a="pass"
[ $score -lt 60 ] && a="fail"
 
case $a in
great)
   echo "优秀"
;;
medium)
   echo "中等"
;;
pass)
   echo "及格"
;;
fail)
   echo "不及格"
;;
*)
  echo "输入有误"
esac


7.3、实例操作二

#!/bin/bash
#Determine Input
 
read -p "请输入一个字符:" string
 
case "$string" in
[a-z]|[A-Z])
    echo "你输入的是字母"
;;
[0-9])
   echo "你输入的是数字"
;;
*)
   echo "你输入的是其他字符"
esac

八、总结

1、test命令:

两种格式

test 条件表达式

[条件表达式]

2、文件测试

-d -e -f -r -w -L

3、整数值比较

-eq -ge -le -gt -lt -ne

4、字符串比较

相等=

不相等 !=

空值 -z

是否存在 -n

5、逻辑测试

逻辑与:-a 或者&&

逻辑或:-o 或者||

逻辑否:!

6、if语句

单分支

双分支

多分支

当 if 语句中使用 [ ] 条件修饰符时, $flag 变量必须加上引号。

当 if 语句中使用 [[]] 条件修饰符时,$flag 变量的引号可有可无。

7、case语句

多分支结构

有关Shell脚本之——条件语句if详解的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  8. ruby - ruby 中有 each_if 吗? - 2

    假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其

  9. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐