Shell 是一种用于管理和执行计算机命令的程序,它既可以被视为命令语言,也可以被视为解释性编程语言。Shell 是用户和操作系统之间的桥梁,它允许用户使用简单的命令来操作计算机。Shell 程序通常由一个命令解释器和一个文件管理器组成,用户可以通过命令行界面与 Shell 程序交互。
Shell 程序可以用不同的编程语言编写,如 c、c++、python 等,但最常见的是使用 c 语言编写。Shell 程序可以运行在终端窗口中,也可以在图形用户界面中运行。
Shell 程序提供了许多功能,如创建文件、修改文件、删除文件、重命名文件、移动文件、查看文件内容、修改文件权限、连接其他计算机等。Shell 程序还支持重定向和管道组合,允许用户将命令的输入和输出重定向到不同的文件中,或者将多个命令的输出组合在一起。
Shell 程序还提供了环境变量和别名命令等功能,允许用户方便地管理和执行计算机命令。通过 Shell 程序,用户可以快速操作计算机,提高工作效率。
因为方便啊~~~
cmd是Windows操作系统的命令行解释器,它使用基于命令的语法和文本界面来执行命令。它主要是用来执行Windows系统命令和批处理文件,具有一定的脚本能力,但是不够强大和灵活。
而shell是Unix/Linux操作系统的命令行解释器,它使用基于文本的语法和可编程的界面来执行命令。shell具有强大的脚本能力,可以通过脚本语言编写复杂的程序和自动化脚本,使得它比cmd更灵活和强大。
讲道理,更多的人首先接触的是windows系统,windows提供的是cmd和powershell,但是为什么那么多人使用shell?主要还是server大多部署在Unix/Linux操作系统的服务器上,所以命令行变得尤为重要。
首先,我们先准备好一个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 变量类型:
在定义变量时,变量名不加美元符号,例如 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
除了上述示例中的参数处理方式,还有几个特殊字符用来处理参数:
综上所述,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 算数运算符:
这些算数运算符在 Shell 脚本中经常被使用,可以实现简单的数值计算和逻辑操作。需要注意的是,Shell 的算数运算能力较弱,复杂的数学运算建议使用专业的数学软件或编程语言来完成。
Shell 支持多种关系运算符,主要用于比较两个数的大小关系。以下是一些常用的 Shell 关系运算符:
这些关系运算符在 Shell 脚本中经常被使用,可以实现简单的大小比较操作。不过,需要注意的是,Shell 的关系运算符只能比较数字,不能比较字符串。如果需要比较字符串,可以使用字符串运算符,例如 ==、!=、>、< 等。
Shell 支持多种逻辑运算符,主要用于组合和控制条件语句的执行。以下是一些常用的 Shell 逻辑运算符:
这些逻辑运算符可以帮助你构建更复杂的条件语句,以满足不同的需求。例如,你可以使用 && 和 || 组合多个命令,以实现顺序执行、分支执行等操作。需要注意的是,逻辑运算符的优先级是从左到右,按照命令的顺序计算。