Linux Shell指令

什么是Shell


        Shell 是一种用于管理和执行计算机命令的程序,它既可以被视为命令语言,也可以被视为解释性编程语言。Shell 是用户和操作系统之间的桥梁,它允许用户使用简单的命令来操作计算机。Shell 程序通常由一个命令解释器和一个文件管理器组成,用户可以通过命令行界面与 Shell 程序交互。
        Shell 程序可以用不同的编程语言编写,如 c、c++、python 等,但最常见的是使用 c 语言编写。Shell 程序可以运行在终端窗口中,也可以在图形用户界面中运行。
        Shell 程序提供了许多功能,如创建文件、修改文件、删除文件、重命名文件、移动文件、查看文件内容、修改文件权限、连接其他计算机等。Shell 程序还支持重定向和管道组合,允许用户将命令的输入和输出重定向到不同的文件中,或者将多个命令的输出组合在一起。
        Shell 程序还提供了环境变量和别名命令等功能,允许用户方便地管理和执行计算机命令。通过 Shell 程序,用户可以快速操作计算机,提高工作效率。

为什么要用Shell

        因为方便啊~~~

        cmd是Windows操作系统的命令行解释器,它使用基于命令的语法和文本界面来执行命令。它主要是用来执行Windows系统命令和批处理文件,具有一定的脚本能力,但是不够强大和灵活。

        而shell是Unix/Linux操作系统的命令行解释器,它使用基于文本的语法和可编程的界面来执行命令。shell具有强大的脚本能力,可以通过脚本语言编写复杂的程序和自动化脚本,使得它比cmd更灵活和强大。

        讲道理,更多的人首先接触的是windows系统,windows提供的是cmd和powershell,但是为什么那么多人使用shell?主要还是server大多部署在Unix/Linux操作系统的服务器上,所以命令行变得尤为重要。

学习

第一个shell脚本

首先,我们先准备好一个linux环境,不管是linux系统,还是虚拟机还是docker容器,都可以,反正我们先创建一个脚本,test.sh

#!/bin/bash    # 这句话表示用linux指定去解析文本内容
#显示hello world!
echo hello world!

然后给这个脚本赋予可执行权限:

chmod +x test.sh

执行之后,就会显示 "hello world!"的字样。

        首先是第一行,当系统遇到一个以 #!/bin/bash 开头的文件时,它会认为该文件是一个需要使用 bash 解释器来执行的脚本,然后会按照该路径去寻找 bash 解释器,并使用该解释器来执行该脚本。在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash。

        然后第二行的echo就是显示的意思。

变量

        在 shell 编程中,变量是用于存储值的标识符,可以是字符串、数字、布尔值等等。下面是一些常见的 shell 变量类型:

  • 环境变量:这些变量在 shell 启动时从环境变量中继承而来,可以通过 export 命令将其导出到子进程中。环境变量可以用于传递参数、配置文件等等。
  • 局部变量:这些变量在脚本或命令中定义,仅在当前 shell 实例中有效。局部变量可以用于保存临时数据、函数参数等等。
  • shell 变量:这些变量是由 shell 程序设置的特殊变量,其中有一部分是环境变量,有一部分是局部变量。shell 变量保证了 shell 的正常运行,例如,$HOME 变量表示当前用户的主目录。

        在定义变量时,变量名不加美元符号,例如 variable。如果要使用变量,则需要在变量名前面加上美元符号,例如 $variable。变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,推荐给所有变量加上花括号,这是个好的编程习惯。

#!/bin/bash
echo $PATH
hello=" world"
echo $hello

echo ${hello}

比如,我们echo $PATH就是显示环境变量,然后我们定义局部变量hello,这时候是不加$的,但是我们如果要使用它时就需要用$hello才可以。但是如果要好习惯的话,就最好加上一个花括号。

而我们如果要定义一个变量就是上一个指令的运行结果,也是通过$或者`xxx`实现的比如

#!/bin/bash

path=$(pwd)

files=`ls -al`

echo current path: $path

echo files: $files

我们用$(pwd)表示执行pwd指令的运行结果,就是当前的绝对路径,将它保存在path变量里

我们让files赋值为ls -al运行后的结果,这是列举出所有文件的指令。

第三行,就是纯粹的显示出$path,这边没有运行,只是取path变量并且显示

第四行,这里显示出$files,所以显示结果会列出所有文件。

字符串

        我们经常写shell脚本的时候要使用达到字符串,因为很多东西都需要命名,都需要字符。在大多数高级语言中,单引号和双引号有着不一样的意思,比如C#中单引号是字符,双引号是字符串,也有些高级语言中它们是一样的,如python中单引号和双引号的意思是一样的。

单引号

        而这时候我们需要在shell中,单引号和双引号的区别会比较大。在shell脚本中,单引号表现的是字符串,单引号中写什么都是原样输出,不会再去运行它,变量是无效的。而且单引号中不能嵌套单引号。比如

hello="world"

greet='Hello ${hello}'

echo $greet

你猜结果会输出什么?结果输出的是 Hello ${hello}

双引号

        双引号就不一样了,在双引号中,变量名前缀$,后引符和转义符会被执行,但是其他的特殊字符都会被关闭。

hello="world"

greet2="Hello ${hello}"

greet3="'Hello ${hello}'"

echo $greet2


第一次输出都是 Hello World

第二次输出是 'Hello World',这时候单引号的功能关闭了

子串,长度和查找

root@93da3b39d1f0:/# string="abcdefg"

#获取字符串的子串
root@93da3b39d1f0:/# echo ${string:1:4}
bcde

#获取字符串的长度
root@93da3b39d1f0:/# echo ${#string}
7

#查找字符串中d的位置
root@93da3b39d1f0:/# echo `expr index "$string" d`
4

#查找字符串那种e的位置
root@93da3b39d1f0:/# echo `expr index "$string" e`
5

#我们如果查找一个不存在的,这时候只匹配第一个
root@93da3b39d1f0:/#echo `expr index "$string" eag`
5


参数

        一般来说,参数是一个程序所需要的,比如说我有个文件叫做test.sh,如果我直接传入参数,按照我的参数来操作,那么完全不需要了解脚本的要求,只需要参数就行。

参数长度为:$#
第一个参数为:$1  
第二个参数为:$2  
第三个参数为:$3  

除了上述示例中的参数处理方式,还有几个特殊字符用来处理参数:

  • # 传递到脚本的参数个数
  • $* 以一个单字符串显示所有向脚本传递的参数。如 ""用「"」括起来的情况、以"12n"的形式输出所有参数。
  • $? 脚本运行的当前进程 ID 号
  • $! 后台运行的最后一个进程的 ID 号
  •  与 $? 相同,但是使用时加引号,并在引号中返回每个参数。如"@"用「"」括起来的情况、以"1""2""n"的形式输出所有参数。
  • - 显示 Shell 使用的当前选项,与 set 命令功能相同。
  • ? 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。

        综上所述,Shell 参数可以为脚本提供输入,使得脚本能够根据这些参数进行相应的操作。通过掌握 Shell 参数的用法,我们可以更加灵活地编写和运行 Shell 脚本。

流程控制

if else语句,用if和fi做开始和结尾,中间用then和else做条件转折。

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

循环语句

Shell 脚本中可以使用 for、while 和 until 关键字来实现循环。其中,for 循环用于遍历列表中的元素,while 循环用于在条件成立时重复执行代码,until 循环用于在条件不成立时重复执行代码。

for i in {1..10}; do  
 echo $i  
done  

count=1  
while [ $count -le 10 ]; do  
 echo "计数:$count"  
 count=$((count+1))  
done  

跳转语句

Shell 脚本中可以使用 break、continue 和 shift 关键字来实现跳转。其中,break 关键字用于跳出当前循环,continue 关键字用于跳过当前循环的剩余部分,shift 关键字用于将循环计数器减 1。

for i in {1..10}; do  
 if [ $i -eq 10 ]; then  
   break  
 fi  
 echo $i  
done  

算数运算符

        Shell 支持多种算数运算符,主要用于计算和操作数字。以下是一些常用的 Shell 算数运算符:

  1. +:加法运算符。例如:a=3; b=5; echo $a+$b,输出结果为 8。
  2. -:减法运算符。例如:a=3; b=5; echo $a-$b,输出结果为 -2。
  3. *:乘法运算符。例如:a=3; b=5; echo $a*$b,输出结果为 15。
  4. /:除法运算符。例如:a=6; b=3; echo $a/$b,输出结果为 2。注意,除法运算的结果永远是一个整数,即使输入的小数部分被截断。
  5. %:取模(余数)运算符。例如:a=6; b=3; echo $a%$b,输出结果为 0。
  6. <<:左移运算符。例如:a=5; echo $a<<2,输出结果为 13。左移运算将二进制数向左移动指定的位数,右侧空出的位用 0 填充。
  7. >>:右移运算符。例如:a=5; echo $a>>2,输出结果为 1。右移运算将二进制数向右移动指定的位数,左侧空出的位用 0 填充。
  8. ^:异或(XOR)运算符。例如:a=5; b=3; echo $a^$b,输出结果为 6。异或运算结果为两个二进制数对应位异的和,相同为 0,不同为 1。
  9. &&:逻辑与(AND)运算符。例如:a=0; b=1; echo $a&&$b,输出结果为 0。逻辑与运算结果为真,则返回 1,否则返回 0。
  10. ||:逻辑或(OR)运算符。例如:a=0; b=1; echo $a||$b,输出结果为 1。逻辑或运算结果为真,则返回 1,否则返回 0。

        这些算数运算符在 Shell 脚本中经常被使用,可以实现简单的数值计算和逻辑操作。需要注意的是,Shell 的算数运算能力较弱,复杂的数学运算建议使用专业的数学软件或编程语言来完成。

关系运算符

        Shell 支持多种关系运算符,主要用于比较两个数的大小关系。以下是一些常用的 Shell 关系运算符:

  1. -eq:等于运算符。例如:a=3; b=5; if [ $a -eq $b ]; then echo "a 等于 b"; else echo "a 不等于 b"; fi,输出结果为 "a 不等于 b"。
  2. -ne:不等于运算符。例如:a=3; b=5; if [ $a -ne $b ]; then echo "a 不等于 b"; else echo "a 等于 b"; fi,输出结果为 "a 不等于 b"。
  3. -lt:小于运算符。例如:a=3; b=5; if [ $a -lt $b ]; then echo "a 小于 b"; else echo "a 大于等于 b"; fi,输出结果为 "a 小于 b"。
  4. -le:小于等于运算符。例如:a=3; b=5; if [ $a -le $b ]; then echo "a 小于等于 b"; else echo "a 大于 b"; fi,输出结果为 "a 小于等于 b"。
  5. -gt:大于运算符。例如:a=3; b=5; if [ $a -gt $b ]; then echo "a 大于 b"; else echo "a 小于等于 b"; fi,输出结果为 "a 大于 b"。
  6. -ge:大于等于运算符。例如:a=3; b=5; if [ $a -ge $b ]; then echo "a 大于等于 b"; else echo "a 小于 b"; fi,输出结果为 "a 大于等于 b"。

        这些关系运算符在 Shell 脚本中经常被使用,可以实现简单的大小比较操作。不过,需要注意的是,Shell 的关系运算符只能比较数字,不能比较字符串。如果需要比较字符串,可以使用字符串运算符,例如 ==、!=、>、< 等。

逻辑运算符


        Shell 支持多种逻辑运算符,主要用于组合和控制条件语句的执行。以下是一些常用的 Shell 逻辑运算符:

  1. &&:逻辑与运算符。表示前后两个命令都成功执行时,条件才为真。例如:command1 && command2,表示只有当 command1 成功执行后,才执行 command2。
  2. ||:逻辑或运算符。表示前后两个命令中有一个成功执行时,条件就为真。例如:command1 || command2,表示只要 command1 或 command2 中有一个成功执行,条件就为真。
  3. !:逻辑非运算符。表示对某个条件的否定。例如:!command_success,表示 command_success 这个条件为假。
  4. &&&:逻辑与&运算符。表示前后两个命令都成功执行时,条件才为真,但与 && 不同的是,&&& 会阻止后面的命令执行,如果前面的命令失败。例如:command1 &&& command2,表示只有当 command1 成功执行后,才执行 command2,但如果 command1 失败,command2 不会执行。
  5. ||&:逻辑或&运算符。表示前后两个命令中有一个成功执行时,条件就为真,但与 || 不同的是,||& 会阻止后面的命令执行,如果前面的命令成功。例如:command1 ||& command2,表示只要 command1 成功执行,command2 就不会执行。

        这些逻辑运算符可以帮助你构建更复杂的条件语句,以满足不同的需求。例如,你可以使用 && 和 || 组合多个命令,以实现顺序执行、分支执行等操作。需要注意的是,逻辑运算符的优先级是从左到右,按照命令的顺序计算。

你可能感兴趣的:(linux,linux,服务器,运维)