什么是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 算数运算符:
- +:加法运算符。例如:a=3; b=5; echo $a+$b,输出结果为 8。
- -:减法运算符。例如:a=3; b=5; echo $a-$b,输出结果为 -2。
- *:乘法运算符。例如:a=3; b=5; echo $a*$b,输出结果为 15。
- /:除法运算符。例如:a=6; b=3; echo $a/$b,输出结果为 2。注意,除法运算的结果永远是一个整数,即使输入的小数部分被截断。
- %:取模(余数)运算符。例如:a=6; b=3; echo $a%$b,输出结果为 0。
- <<:左移运算符。例如:a=5; echo $a<<2,输出结果为 13。左移运算将二进制数向左移动指定的位数,右侧空出的位用 0 填充。
- >>:右移运算符。例如:a=5; echo $a>>2,输出结果为 1。右移运算将二进制数向右移动指定的位数,左侧空出的位用 0 填充。
- ^:异或(XOR)运算符。例如:a=5; b=3; echo $a^$b,输出结果为 6。异或运算结果为两个二进制数对应位异的和,相同为 0,不同为 1。
- &&:逻辑与(AND)运算符。例如:a=0; b=1; echo $a&&$b,输出结果为 0。逻辑与运算结果为真,则返回 1,否则返回 0。
- ||:逻辑或(OR)运算符。例如:a=0; b=1; echo $a||$b,输出结果为 1。逻辑或运算结果为真,则返回 1,否则返回 0。
这些算数运算符在 Shell 脚本中经常被使用,可以实现简单的数值计算和逻辑操作。需要注意的是,Shell 的算数运算能力较弱,复杂的数学运算建议使用专业的数学软件或编程语言来完成。
关系运算符
Shell 支持多种关系运算符,主要用于比较两个数的大小关系。以下是一些常用的 Shell 关系运算符:
- -eq:等于运算符。例如:a=3; b=5; if [ $a -eq $b ]; then echo "a 等于 b"; else echo "a 不等于 b"; fi,输出结果为 "a 不等于 b"。
- -ne:不等于运算符。例如:a=3; b=5; if [ $a -ne $b ]; then echo "a 不等于 b"; else echo "a 等于 b"; fi,输出结果为 "a 不等于 b"。
- -lt:小于运算符。例如:a=3; b=5; if [ $a -lt $b ]; then echo "a 小于 b"; else echo "a 大于等于 b"; fi,输出结果为 "a 小于 b"。
- -le:小于等于运算符。例如:a=3; b=5; if [ $a -le $b ]; then echo "a 小于等于 b"; else echo "a 大于 b"; fi,输出结果为 "a 小于等于 b"。
- -gt:大于运算符。例如:a=3; b=5; if [ $a -gt $b ]; then echo "a 大于 b"; else echo "a 小于等于 b"; fi,输出结果为 "a 大于 b"。
- -ge:大于等于运算符。例如:a=3; b=5; if [ $a -ge $b ]; then echo "a 大于等于 b"; else echo "a 小于 b"; fi,输出结果为 "a 大于等于 b"。
这些关系运算符在 Shell 脚本中经常被使用,可以实现简单的大小比较操作。不过,需要注意的是,Shell 的关系运算符只能比较数字,不能比较字符串。如果需要比较字符串,可以使用字符串运算符,例如 ==、!=、>、< 等。
逻辑运算符
Shell 支持多种逻辑运算符,主要用于组合和控制条件语句的执行。以下是一些常用的 Shell 逻辑运算符:文章来源:https://www.toymoban.com/news/detail-613927.html
- &&:逻辑与运算符。表示前后两个命令都成功执行时,条件才为真。例如:command1 && command2,表示只有当 command1 成功执行后,才执行 command2。
- ||:逻辑或运算符。表示前后两个命令中有一个成功执行时,条件就为真。例如:command1 || command2,表示只要 command1 或 command2 中有一个成功执行,条件就为真。
- !:逻辑非运算符。表示对某个条件的否定。例如:!command_success,表示 command_success 这个条件为假。
- &&&:逻辑与&运算符。表示前后两个命令都成功执行时,条件才为真,但与 && 不同的是,&&& 会阻止后面的命令执行,如果前面的命令失败。例如:command1 &&& command2,表示只有当 command1 成功执行后,才执行 command2,但如果 command1 失败,command2 不会执行。
- ||&:逻辑或&运算符。表示前后两个命令中有一个成功执行时,条件就为真,但与 || 不同的是,||& 会阻止后面的命令执行,如果前面的命令成功。例如:command1 ||& command2,表示只要 command1 成功执行,command2 就不会执行。
这些逻辑运算符可以帮助你构建更复杂的条件语句,以满足不同的需求。例如,你可以使用 && 和 || 组合多个命令,以实现顺序执行、分支执行等操作。需要注意的是,逻辑运算符的优先级是从左到右,按照命令的顺序计算。文章来源地址https://www.toymoban.com/news/detail-613927.html
到了这里,关于Linux Shell指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!