Linux -----------------------Shell &流程判断

什么是shell

Shell 是操作系统的用户界面,负责接收和解释用户的命令,并将这些命令转化为操作系统内部能够理解的指令,然后执行相应的操作。Shell还允许用户编写脚本,以自动化和批处理任务,从而提高效率。在Linux系统中,有多种不同的Shell可供选择,如Bash、Zsh、Korn Shell等,用户可以根据需要选择最适合他们的Shell来管理和控制系统。这种用户与操作系统之间的交互方式使得Linux系统非常灵活和强大,因为它允许用户以不同的方式自定义和操作系统进行交互。

shell的种类

Linux系统提供多种不同的Shell以供选择。在Linux系统中,默认的Shell是Bourne Again Shell(bash)。:

**  linux常用的三种shell:**

Linux中的shell有多种类型,其中最常用的三种是bourne shell(sh)、c shell(csh)、korn shell(ksh)。

**  Bourne shell**

Bourne shell 是一个交换式的命令解释器和命令编程语言。

Bourne shell曾作为管理系统的常用工具,是UNIX操作系统的标准shell。大部份的系统管理命令文件,例如 rc start、stop 与shutdown 都是Bourne shell 的命令档,且在单一使用者模式(single user mode)下以 root 签入时它常被系统管理者使用。Bourne shell因其简洁高效而闻名,它是由AT&T开发的。 Bourne shell 提示符号的默认值是 $。

** c shell**

c shell是一种比 Bourne Shell更适合的变种 Shell,使用的是"类C"语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。

C shell 是柏克莱大学(Berkeley)所开发的,且加入了一些新特性,如命令列历程(history)、别名(alias)、内建算术、档名完成(filename completion)、和工作控制(job control)。对于常在交谈模式下执行 shell 的使用者而言,他们较喜爱使用 C shell;但对于系统管理者而言,则较偏好以 Bourne shell 来做命令档,因为 Bourne shell 命令档比 C shell 命令档来的简单及快速。C shell 提示符号的默认值是 %。

**  korn shell**

korn shell是一个 Unix shell 。在20世纪80年代早期,David Korn在贝尔实验室编写了它。它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性,例如贝尔实验室用户需要的命令编辑。

Korn shell 是Bourne shell 的超集(superset),由 AT&T 的 David Korn 所开发。它增加了一些特色,比 C shell 更为先进。Korn shell 的特色包括了可编辑的历程、别名、函式、正规表达式万用字符(regular expression wildcard)、内建算术、工作控制(job control)、共作处理(coprocessing)、和特殊的除错功能。Bourne shell 几乎和 Korn shell 完全向上兼容(upward compatible),所以在 Bourne shell 下开发的程序仍能在 Korn shell 上执行。Korn shell 提示符号的默认值也是 $。在 Linux 系统使用的 Korn shell 叫做 pdksh,它是指 Public Domain Korn Shell。

在日常使用中,大多数Linux用户会使用Bash,因为它在Linux系统中普遍存在,具有广泛的支持和资源。然而,了解其他Shell也可以为特定的任务和需求提供更多选择。根据具体情况,用户可以切换Shell来执行不同的任务,或者编写特定于Shell的脚本来实现自定义功能。

if else语句

在Linux中,`if`语句是用于条件判断和逻辑控制的关键部分。以下是`if`语句的基本语法,包括`if`、`if else`和`if elif else`的示例:

基本的if语法

语法形式:

if [ condition ]; then

如果条件为真,则执行以下代码块

可以包含一个或多个命令

fi

示例:

if [ -f file.txt ]; 
then
    echo "file.txt 存在。"
fi

if else语法

if [ condition ]; then

如果条件为真,则执行以下代码块

else

如果条件为假,则执行以下代码块

fi

示例:

if [ -f file.txt ]; 
then
    echo "file.txt 存在。"
else
    echo "file.txt 不存在。"
fi

if elif else语法

if [ condition1 ]; then

如果条件1为真,则执行以下代码块

elif [ condition2 ]; then

如果条件2为真,则执行以下代码块

else

如果前面的条件都为假,则执行以下代码块

fi

示例:

if [ -d directory ]; then
    echo "directory 存在且是一个目录。"
elif [ -f file ]; then
    echo "file 存在且是一个文件。"
else
    echo "directory 和 file 都不存在。"
fi

在这些语法中,`[ condition ]`用于表示条件测试,根据条件的真假执行不同的代码块。您可以根据具体的需求嵌套`if`语句来进行更复杂的逻辑控制。

注意:

(())是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( a==b ))判断条件成立,进入 if,执行 then 后边的 echo 语句。更多关于(())的介绍,可参考Linux Shell - 运算符。

if条件判断句的退出状态

在Linux中,命令的退出状态是一个整数值,通常被称为**退出码(Exit Code)**或退出状态码(Exit Status)。这个退出状态用于表示命令的执行结果,通常遵循以下规则:

  • 退出状态为0表示成功执行。

  • 非零退出状态表示命令执行失败或出现问题。

通常,非零退出状态可以用来指示命令的特定错误类型或问题。不同的命令可能使用不同的非零退出状态来表示不同的错误条件。例如,像您提到的`diff`命令,返回0表示没有差异,返回1表示找到差异,返回2表示出现无效文件名等。

在Shell脚本中,您可以使用特殊变量`$?`来获取上一个命令的退出状态。以下是一个示例:

```bash
#!/bin/bash

ls /nonexistent_directory  # 运行一个不存在的命令
if [ $? -eq 0 ]; then
  echo "Command executed successfully"
else
  echo "Command failed with exit status $?"
fi
```

在上面的示例中,`ls /nonexistent_directory`命令会失败,因为指定的目录不存在。`$?`用于获取上一个命令的退出状态,然后通过条件判断来输出相应的消息。通过检查命令的退出状态,Shell脚本可以根据命令的执行结果采取不同的操作,使脚本更具弹性和鲁棒性。

退出状态和逻辑运算符的组合

Shell的if语句可以使用逻辑运算符来组合多个命令的退出状态,以便进行多个条件的判断。常见的逻辑运算符有&&(逻辑与)、||(逻辑或)和!(逻辑非)。以下是一些示例:

运算符 使用格式 说明
&& 或 -a 条件1 && 条件2 逻辑与运算符,当 条件1 和 条件2 同时成立时,整个表达式才成立。 如果检测到条件1 的退出状态为 0,就不会再检测 条件2 了,因为不管条件2 的退出状态是什么,整个表达式必然都是不成立的,检测了也是多此一举。
|| 或 -o 条件1 || 条件2 逻辑或运算符,条件1 和 条件2 两个表达式中只要有一个成立,整个表达式就成立。 如果检测到 条件1 的退出状态为 1,就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。
! !条件 逻辑非运算符,相当于"取反"的效果。如果 条件成立,那么整个表达式就不成立;如果 条件 不成立,那么整个表达式就成立。

具体代码:

if [ -f file1 ] && [ -f file2 ];
then
  echo "Both file1 and file2 exist."
fi

if [ -d directory1 ] || [ -d directory2 ]; 
then
  echo "At least one of directory1 or directory2 exists."
fi

if ! [ -e file1 ];
then
  echo "file1 does not exist."
fi

while语句

`while`语句在Linux中用于循环执行一系列命令,可以用来创建不定次数的循环。以下是`while`语句的基本语法,包括一个简单的示例:

while [ condition ]

do

在条件为真时执行以下命令

done

注意:condition`是一个测试条件,当条件为真时,`do`和`done`之间的命令会被执行。当`condition`的值为假时,循环结束,脚本继续执行后续的命令。

#!/bin/bash

count=0

while [ $count -lt 5 ]
do
    echo "Hello, World"
    count=$((count + 1))
done

使用`**break`**语句来在循环中提前退出循环,或者使用其他条件来控制循环的终止条件,以满足不同的需求。

until语句

until语句是Shell中的另一种循环控制结构,与while循环相反,它会一直循环直到条件为真。当条件为假(返回值为1,代表false)时,until循环会继续执行,而当条件为真时,循环终止。

以下是until语句的基本语法和示例:

until [ condition ]

do

在条件为假时执行以下命令

done

示例:指定输出多少次hello world

#!/bin/bash

count=0

until [ $count -ge 5 ]
do
    echo "Hello, World"
    count=$((count + 1))
done

for语句

与其他编程语言类似,Shell同样支持for循环,允许您=在指定范围内或一组项目上进行迭代。

循环方式一:在指定的一组项目上进行迭代

语法形式:

for var in item1 item2 ... itemN

do

在每个项目上执行命令

done

注意:var是循环变量,item1 item2 ... itemN 是循环的范围。

示例:输出5次hello world

#!/bin/bash

for i in 1 2 3 4 5
do
    echo "Hello, World"
done

循环方式二:在指定的整数范围内进行迭代

语法形式:

for ((start; end; step))

do

在指定范围内执行命令

done

注意:start表示循环范围的起始值,必须为整数end表示循环范围的结束值,必须为整数

示例:循环1到5并打印

#!/bin/bash

for ((i=1; i<=5; i++))
do
    echo $i
done

循环方式三:在不同的用法中,可以使用通配符来表示一组项目

无限循环语法:

for var in {item1,item2,...,itemN}

do

在每个项目上执行命令

done

示例:打印5次hello world

#!/bin/bash

for i in {1,2,3,4,5}
do
    echo "Hello, World"
done

select语句

select语句是Shell的一种特殊循环,用于创建交互式菜单,用户可以从菜单中选择一个编号并执行相应的操作,增强交互性。select语句通常与case语句一起使用,以根据用户的选择执行不同的命令。 select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景,而其他语言则没有。以下是select语句的基本语法和示例。

注意:select 是无限循环(死循环),输入空值,或者输入的值无效都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。 执行命令过程中,终端会输出 #? 代表可以输入选择的菜单编号。

基础语法:

select var in item1 item2 ... itemN

do

显示菜单并等待用户选择

用户选择后,执行与选择相关的命令

done

注:

  • var是用户选择的编号。
  • item1item2 等是菜单中的选项。

示例1:

#!/bin/bash

select option in "Option 1" "Option 2" "Option 3" "Quit"
do
    case $option in
        "Option 1")
            echo "You chose Option 1"
            ;;
        "Option 2")
            echo "You chose Option 2"
            ;;
        "Option 3")
            echo "You chose Option 3"
            ;;
        "Quit")
            break
            ;;
        *)
            echo "Invalid option"
            ;;
    esac
done

case语句

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令;当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

每一匹配模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;(类似break)。取值将检测匹配的每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 caseinesac 都是 Shell 关键字, esac就是case的反写在这里代表结束case。

语法形式:

case value in

pattern1)

当value匹配pattern1时执行这里的命令

;;

pattern2)

当value匹配pattern2时执行这里的命令

;;

pattern3)

当value匹配pattern3时执行这里的命令

;;

*)

当value与上述模式都不匹配时执行这里的命令

;;

esac

注意:

value是要匹配的值。

pattern1、pattern2、pattern3 等是不同的模式,可以是数字、字符串,也可以包括通配符。

;; 表示模式匹配后,执行完命令后结束case语句。

匹配模式:可以是一个数字、一个字符串,甚至是一个简单正则表达式。简单正则表达式支持如下通配符:

格式 说明
* 表示任意字符串。
[abc] 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n] 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
| 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

演示:

 #!/bin/bash

fruit="apple"

case $fruit in
    "apple")
        echo "It's an apple."
        ;;
    "banana")
        echo "It's a banana."
        ;;
    "cherry")
        echo "It's a cherry."
        ;;
    *)
        echo "It's something else."
        ;;
esac
相关推荐
码农不屈的一生5 分钟前
ARM架构服务器安装部署KVM虚拟化环境
运维·服务器·arm开发·架构
vvw&6 分钟前
如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程
linux·运维·服务器·后端·nginx·ubuntu·性能优化
速盾cdn6 分钟前
速盾:服务器CDN加速解析的好处有哪些呢?
运维·服务器
maply7 分钟前
常用的公共 NTP(网络时间协议)服务器
运维·服务器·网络
网硕互联的小客服9 分钟前
如何排查香港服务器上的权限问题
linux·运维·服务器·网络·云计算
缘友一世9 分钟前
1panel fail2ban助力服务器SSH以及删除SSH登陆日志
运维·服务器·ssh
果汁分你一半l10 分钟前
shell脚本的使用
linux·vim
Days205011 分钟前
慎用翼讯科技服务器以及不知名服务器的说明
运维·服务器·科技
西西偷西瓜31 分钟前
云效流水线使用Node构建部署前端web项目
运维·前端·自动化
Young.Dr34 分钟前
修改r包源代码 ctrl+鼠标点击函数,进入函数内部getgeo 源码
服务器