linux下的shell是什么?

shell是连接用户和内核的接口,允许用户与系统交互。
它接受用户输入的命令并将其发送到内核执行。
它是内核和用户之间的解释程序Linux现在指的是/bin/bash解释器,它负责将用户/程序指令翻译并转发给内核操作系统Linux系统提供了许多不同的shell可供选择。
在Linux系统上,默认shell是BourneAgainShell(bash)。
Linux中常用的三种shell:Linux中有多种shell,最常用的三种是bourneshell(sh)、cshell(csh)和kornshell(ksh)。
1.BourneshellBourneshell是一种命令解释器和可互换的命令行编程语言。
Bourneshell曾经是一种常见的系统管理工具,是UNIX操作系统的标准shell。
大多数系统管理命令文件(例如rcstart、stop和shutdown)都是Bourneshell命令文件,通常由系统管理员在单用户模式下以root身份登录时使用。
Bourneshell由AT&T开发,以其简单和高效而闻名。
Bourneshell提示符号的默认值为$。
2.cshell是比BourneShell更方便的shell变体它使用“类似C”的语法Csh是C语言风格的shell,由伯克利大学开发,并添加了诸如行过程命令等新功能。
行、别名、内置算术、文件名完成和作业检查。
对于经常以聊天模式运行shell的用户来说,他们更喜欢使用Cshell,但对于系统管理员来说,他们更喜欢使用Bourneshell作为脚本,因为Bourneshell脚本比脚本文件更简单、更快。
Cshell提示符号的默认值为%。
3.kornshellkornshell是一个Unixshell。
DavidKorn在20世纪80年代初在贝尔实验室编写了它,它与Bourneshell完全兼容,并包含许多Cshell功能,例如贝尔实验室用户请求的编辑命令。
Kornshell是Bourneshell的超集,由AT&T的DavidKorn开发。
它增加了一些功能并且比Cshell更先进。
Kornshell的功能包括可编辑过程、别名、函数、正则表达式字符、内置算术、作业控制、协作处理和特殊调试功能。
Bourneshell几乎完全向后兼容Kornshell,因此在Bourneshell下开发的程序仍然可以在Kornshell中运行。
Kornshell提示符号的默认值也是$。
Linux系统上使用的Kornshell称为pdksh,它指的是PublicDomainKornShell。

Linux入门学习笔记——Shell命令

Shell命令1.Shell简介

Shell是一个用C语言编写的程序,是用户使用Linux的桥梁。
shell既是一种命令语言,又是一种编程语言。
shell是一个提供接口的应用程序,用户可以通过该接口访问操作系统内核的服务。

KenThompson的sh是第一个Unixshell,而WindowsExplorer则是典型的图形界面shell。
shellscript是为shell编写的脚本程序。

2.Shell变量2.1变量定义

示例:your_name="piggy"

变量名和等号之间不能有空格。
就像您熟悉的任何编程语言一样。
同时,变量名的命名必须遵循以下规则:

只能命名字母、数字和下划线,且第一个字符不能以数字开头。

中间不允许有空格,可以使用下划线吗?_。

不允许使用标点符号。

您不能使用Bash中的关键字(您可以使用help命令查看保留关键字)。

2.2使用变量

要使用已定义的变量,只需在变量名称前添加美元符号即可。

your_name="cat"echo?$your_name

已定义的变量可以重新定义。

2.3只读变量

要将变量定义为只读变量,请使用readonly命令。
只读变量的值无法更改。

2.4删除变量

要删除变量,请使用未设置的变量。

unsetvariable_name

变量一旦被删除,就不能再次使用。
unset命令不能删除只读变量。

2.5变量类型

1)局部变量?局部变量在脚本或命令中定义,仅在当前shell实例中有效。
在另一个shell中启动的程序无法访问局部变量。

2)环境变量?所有程序(包括由shell启动的程序)都可以访问环境变量。
有些程序需要环境变量来确保正常运行。
Shell脚本还可以在需要时定义环境变量。

3)Shell变量是shell程序设置的特殊变量。
有些shell变量是环境变量,有些是局部变量。
这些变量确保shell的正常运行。

3.Shell字符串

字符串是shell编程中最常用、最有用的数据类型。
字符串可以是单引号、双引号或不带引号的。

单引号字符串的限制:

单引号内的所有字符均按原样输出,单引号字符串中的变量无效。

Single-带引号的字符串单引号不能出现在带引号的字符串中(即使在对单引号使用转义字符之后),但它们可以成对出现并可用作字符串连接。

双引号的优点:

变量可以出现在双引号内。

转义字符可以出现在双引号内。

3.1Stringyour_name="连接run"#?使用双引号连接Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号连接Greeting_2='hello,?'$your_name'?!'greeting_3='你好,?${your_name}?!'echo?$greeting_2$greeting_3输出:你好,?Run?!?Hello,?Run?!Hello,?Lun?!?hello,?${your_name}?!3.2获取字符串长度string="abcd"echo?${#string}?#?输出?43.3提取子字符串string="runoob?is?a?great?site"echo?${string:1:4}?#?输出?unoo3.4字符?**i**?或者搜索子字符串以查找?**o**?的位置(计算第一个出现的字符):string="runoob?is?a?great?site"\echo?`expr?index"?io`#?Output?4

注意:在上面的脚本中,?`?是反引号。
,而不是单引号?'。

4.Shell数组4.1数组定义

Shell使用方括号来表示数组,数组元素之间用“空格”符号分隔。
数组定义的一般格式为:数组名=(value1value2...valuen)

例如:array_name=(value0value1value2value3)

OR

array_name=(value0value1value2value3)

您还可以单独定义数组的每个组件。
有:

array_name[0]=value0array_name[1]=value1array_name[n]=valuen

下标不一定要连续,范围有限制的下标。

4.2读取数组

一般格式为:${数组名[下标]}

示例:v=${array_name[n]}

使用?@?该符号可以获取数组的任何元素。
示例:echo${array_name[@]}

4.3获取数组长度

获取数组长度的方法与获取字符串长度的方法相同。
示例:

#?获取数组中元素的个数length=${#array_name[@]}#?或length=${#array_name[*]}#?获取数组中单个元素的长度数组长度n=${#array_name[n]}5.Shell注释

单行注释:以?#?开头

多行注释:

:<运行shell时将参数传递给脚本。
脚本中获取参数的格式为$n。
n?代表一个数字,1是运行脚本的第一个参数,2是运行脚本的第二个参数。
|参数格式|描述||----|-------||$#?|传递给脚本的参数数量||$?|将传递给脚本的所有参数显示为单个字符串。

||$$?|当前运行脚本的进程ID号?||$!?|后台运行的最后一个进程的ID号?||$@?|与$相同,但返回引号中的每个参数做。
||$-?|与set命令功能相同||$|显示最后一个命令的退出状态。
0表示没有错误,任何其他值表示有错误。

7.Shell数组

Shell数组用方括号表示,元素之间用“空格”符号分隔。

array_name=(value1value2...valuen)

7.1读取数组

${array_name[index]}

7.2获取数组的所有元素

使用@或*数组获取数组的所有元素,例如

array[0]=Aarray[1]=Barray[2]=Carray[3]=Decho?"数组的元素为:?${array[*]}"echo?"数组的元素为:相当于?${array[@]}"7.3获取数组长度your_name="run"#?使用双引号连接。
Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号连接。
Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2?$greeting_3输出:hello,?run?!?hello,?run?!hello,?跑步?!?你好,?${your_name}?!08.Shell运算符

与其他编程语言一样,Shell支持多种运算符,包括:

算术运算符

关系运算符

布尔运算符

字符串运算符

文件测试运算符

Basicbash不支持简单的数学运算,但支持其他命令这可以通过.当像awk和expr一样实现时,最常用的是expr。
expr是一个表达式求值工具,可用于计算表达式。

例如,添加两个数字(使用反引号?`?而不是单引号?')

your_name="run"#?使用双引号Greeting="hello,?"$your_name"?!"greeting_1="Hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号连接。
Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?!表达式hello,?run?!?hello,?${your_name}?!1

之间必须有一个空格,并且必须有一个空格

完整表达式必须包含`

8.1算术运算符运算符说明示例+expr$a+$b加法结果为?30-减法expr$a-$b为-10*乘法expr$a\*$b结果是?200/除法expr$b/$a结果是?2%余数expr$b%$a结果是?0=Assigna=$b将变量b的值赋给a==Equal。
比较两个数字,如果相等则返回true[$a==$b],如果不相等则返回?false!=。
比较两个数字,如果不同则返回true。
[$a!=$b]返回true。

注意:

条件表达式必须用方括号括起来,并且必须包含空格。
例如:[$a==$b]不正确,应写为[$a==$b]。

乘号(*)前面必须有反斜杠\才能执行乘法

8.2关系运算符运算符说明示例-eq检测两个数字是否相等,相等返回true。
[$a-eq$b]返回?false。
-ne检测两个数字是否匹配,如果数字不相等,则返回true[$a-ne.$bifnotequal]返回true-gt,检测左边的数字是否大于右边的数字。
如果是,则返回true。
[$a-gt$b]返回false-lt检测左边的数字是否更大。
如果小于右侧的数字则返回true。
[$a-lt$b]返回true-ge检测左侧。
左边的数字是否大于等于右边的数字,如果是则返回true[$a-ge$b],或者返回false-le检查左边的数字是否小于等于。
如果是,则返回true。
[$a-le$b]返回true。
8.3布尔运算符运算符说明是不是运算符。
如果表达式为true,则返回false;否则返回true。
[!false]返回true-o,true[$a-lt20-o$b-gt100]返回?true-如果其中一个操作为true。
AND运算,两个表达式都为true。
仅返回true[$a-lt20-a$b-gt100]。
false8.4逻辑运算符运算符描述示例&&逻辑AND[[$a-lt100&&$b-gt100]]返回false//逻辑OR[[$a-lt100//$b-gt100]]返回true8.5字符串运算符运算符描述示例=检测两个字符串是否相等,相等则返回true。
[$a=$b]返回false!=检测两个字符串是否不相等,如果不相等则返回true。
[$a!=$b]返回?true-z检测单词。
字符串长度是否为0,如果为0,则返回true[-z$a],如果为0,则返回false-n检查字符串长度是否不为0,如果不为0,则返回true[-n"$a"]返回true$,检查字符串长度is0如果为空,true[$a],返回?true8.6文件测试运算符运算符说明示例-bfile检测文件是否为块设备文件。
然后是真的返回。
[-b$file]返回false。
-cfile检测文件是否为字符设备文件。
如果是,则返回true[-c$.file]?false-dfilecheck返回测试文件是否是目录。
如果是则返回true,如果是则返回false。
-ffile检测文件是否是常规文件(既不是目录也不是设备文件)。
如果是,则返回true。
f$file]]Return?true-gfile如果文件设置了SGID位,则返回true[-g$file],并且返回?false-kfile。
检查文件是否设置了StickyBit,如果是,则返回true[-k$file]。
检查?false-pfile.file是否存在。
如果是众所周知的管道,则返回true[-p$file],return?false-ufile检测文件是否设置了SUID位。
如果是,则返回true[-u$file]和?false-rfile。
检查文件是否可以读取,如果可以则返回true。
-r$file]返回?true-wfile来检测文件是否可写。
如果是,则返回true。
[-w$file]返回?true-xfile以检测文件是否可执行。
如果是,则返回true[-x.$file]Return?true-Sfile检测文件是否为空(文件大小大于0),不为空则返回true。
[-s$file]返回?true-efile检测文件(包括其目录)是否存在,如果存在则返回true。
[-e$file]return?true9.Shellecho命令9.1显示通用字符串表示your_name="run"#?使用双引号连接Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?请使用单引号连接Greeting_2='你好,?'$your_name'?!'greeting_3='你好,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!29.2显示转义字符your_name="run“#?使用双引号来连接。
Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号接。
Greeting_2='Hello,?'$your_name'?!'greeting_3='Hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:Hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!39.3显示变量

read命令从标准输入读取一行。
,并将输入行中每个字段的值分配给shell变量。

your_name="run"#?使用双引号,Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1连接。
#?使用单引号连接Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!run?!hello,?run?!?hello,?${your_name}?!49.4换行显示your_name="run"#?双引号Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?单引号请使用连接Greeting_2='你好,?'$your_name'?!'greeting_3='你好,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!59.5显示无换行your_name="run"#?使用双引号连接。
Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号连接。
greeting_2='Hello,?'$your_name'?!'greeting_3='Hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?,?run?!?你好,?${your_name}?!6显示9.6结果将传送到文件your_name="run"#?。
使用双引号连接Greeting="hello,?"$。
your_name"?!"greeting_1="Hello,?${your_name}?!"echo?$greeting$greeting_1#?使用单引号连接。
Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?!你好,?运行?!?你好,?${your_name}?!710.Shellprintf命令

printf接受带引号的文本或空格分隔的参数。
打印?您可以使用外部格式化字符串,或指定宽度、左对齐和右对齐。
字符串等默认printf的行为不是这样的:?echo?自动添加换行符;您可以手动添加?\n。

printf命令语法:printf?format-string?[arguments...]

your_name="run"#使用?Greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?用于连接双引号和单引号。
连接引号Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!8Printf的转义序列序列描述\a警告字符,通常ASCIIBEL字\bback\c抑制(抑制)尾随换行符(仅在由%b格式说明符控制的参数字符串中有效)、参数中的任何剩余字符以及输出中的下一个参数。
格式字符串中的所有剩余字符都将被忽略。
\f换页\n换行\r回车符\水平制表符\v垂直制表符\文字反斜杠字符\ddd表示具有1到3位八进制值的字符。
仅在格式字符串中有效。
\0ddd表示1到3的八进制值字符。
命令

shell的测试命令用于检查某个条件是否为真。
您可以测试值、字符和文件。

11.1数值测试参数说明如果-eq等于-ne,则为真。
如果满足以下条件,则不是true:-如果gt大于则为真-如果ge大于或等于,则为True-lt如果小于或等于则为true-le如果小于或等于则为真11.2字符串测试参数说明=trueifequal!=如果不等于,则为true-zstring如果字符串长度为-nstring如果字符串长度不为0,则true11.3文件测试参数说明-e文件名如果文件存在true-r文件名文件存在且可读取如果存在则为True。
-w文件名如果文件存在并且可写,则为真。
-x文件名如果文件存在并且可执行,则为真。
-s文件名如果文件存在并且至少包含一个字符,则为真。
-dfilename如果文件存在并且是目录,则为true。
-ffilename如果文件存在则为真。
-cfilename如果文件存在并且是字符特殊文件,则为true。
-bfilename如果文件存在并且是块特殊文件,则为true。
12、Shell函数

Shell中函数定义的格式如下:

your_name="execute"#?使用双引号连接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting$greeting_1#?Greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2使用单引号连接$greeting_。
3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!9

注意:

调用函数后,通过$?获取函数返回值

全部函数在使用之前必须先定义。
这意味着该函数必须放置在脚本的开头,并且在shell解释器首先发现它之前不能使用。
函数调用只需使用函数名称。

函数参数

shell允许在调用函数时将参数传递给函数。
在函数体内,参数值采用$n格式。
参数处理|描述|||----|-------------------||$#?|传递给脚本或函数的参数数量||$?|将传递给脚本的所有参数显示为单个字符串||$$?|运行脚本当前进程ID号||$!?|后台运行的最后一个进程的ID号||$@?|$与相同,但在使用时添加引号并返回引号中的每个参数||$-?|显示shell当前使用的选项。
与set命令功能相同||$|显示最后一个命令的退出状态。

0表示没有错误,任何其他值表示有错误。

原文:https://juejin.cn/post/7101098366871797773