Linux中Shell基础知识梳理
其他
2018-09-17 08:48:48
阅读次数: 0
一、命令
- 程序名与参数之间要用空白字符分隔,通常是空格,制表符或换行符
- 同一行上可以输入多条命令,命令之间用分号;分隔
- 执行的每条命令都会返回一个叫做状态码的数字,其中0表示执行成功,非0表四故障,不同的数字代表不同的含义
- 管道符|用于将一个命令的标准输出连接到另一个命令的标准输入,其退出状态码是管道中最后一个命令的退出状态码,在管道前放上!会将最后一个命令退出状态码的逻辑反作为管道的退出状态码
- 如果命令序列是以&作为结尾,它会将在后台以异步方式运行。shell会在终端显示其进程ID和作业编号,并提示输入下一条交互式命令
- 如果命令最后一行是字符反斜杠,那么可以在下一行继续输入命令
- &&字符仅在其之前的命令返回为0的退出状态码时才执行之后的命令,||字符仅在其之前的命令反回非0的退出状态码时才执行之后的命令
- 仅当grep返回为0的退出状态码时才执行echo
二、注释
- 如果行中出现注释符#,Shell会将剩余的部分视为注释并将其忽略,不在进行解释,替换和执行
三、参数与变量
- 有三种不同类型的参数:Shell变量,特殊参数及位置参数
Shell变量
- Shell变量必须以字母或下划线_开头,之后可以是任意的字母、数字和下划线
- 可以在命令行上给Shell变量进行赋值
位置参数
- 当Shell执行程序时,程序名被赋给变量0,命令行上输入的参数分别赋给
1,
2,$3,可以使用set命令为位置参数赋值。位置参数1~9可以直接引用,大于9的位置参数必须放在花括号中,${10}
特殊参数
表 3.1 特殊的参数变量
参数 |
含义 |
$# |
传递给程序的参数数量或者由set语句设置的参数数量 |
$* |
引用所有的位置参数 |
$@ |
和
∗一样,除了出现在双引号中的时候("
@”)是以”
1"、"
2”、”$3”的形式来引用所有的位置参数 |
$0 |
所执行的程序名 |
$$ |
所执行程序的进程 |
$! |
送入后台执行的最近的一个程序的进程ID |
$? |
最近执行的非后台命令的推出码状态 |
$- |
生效的当前选项标志 |
表 3.2 Shell使用的其他变量
参数 |
含义 |
PS1 |
主命令提示符,通常是”$” |
PS2 |
辅命令提示符,通常是”>” |
PS4 |
跟踪模式下的提示符,通常是”+” |
PWD |
当前工作目录的路径 |
HISTSIZE |
如果设置,则制定了可保存的先前输入过的命令的数量 |
参数替换
- 在最简单的情况下,可以通过在参数前面加上美元符号$来访问参数的值。
表 3.3 参数替换
参数 |
含义 |
parameter或
{parameter} |
替换为parameter的值 |
${parameter:value} |
如果parameter已设置切不为空,替换它的值;否则,替换为value |
${parameter-value} |
如果parameter已设置,替换它的值;否则,替换为value |
${parameter:=value} |
如果parameter已设置且不为空,替换它的值;否则,替换为value并将它的值赋给parameter |
${parameter=value} |
如果parameter已设置,替换它的值;否则,替换为value并将其赋给parameter |
${parameter:?value} |
如果parameter已设置且不为空,替换它的值;否则,将value写入标准错误并退出,如果忽略value,则向标准错误写入parameter:parameter null or not set |
${parameter?value} |
如果parameter已设置,替换它的值;否则,将value写入标准错误并退出,如果忽略value,则向标准错误写入parameter:parameter null or not set |
${parameter:+value} |
如果parameter已设置且部位空,替换为value;否则,替换为空 |
${parameter}+value |
如果parameter已设置,替换为value;否则,替换为空 |
${#parameter} |
替换为parameter的长度,如果parameter是*或@,结果不定 |
${parameter#pattern} |
从parameter的左边开始删除pattern的最短匹配,余下的内容作为参数替换的结果,pattern可以使用文件名替换字符(*、?、[…]、!和@) |
${parameter##pattern} |
从parameter的左边开始删除pattern的最长匹配 |
${parameter%pattern} |
从parameter的右边开始删除pattern的最短匹配 |
${parameter%%pattern} |
从parameter的右边开始删除pattern的最长匹配 |
四、命令的重新输入
- Shell保存了最近输入的命令列表。命令的数量由HISTSIZE变量决定(默认是128)保命令历史列表的文件是由HISTFILE变量决定(默认是$HOME/.sh_history),因为命令保存在历史文件中,所以这些命令在不同的登录会话期间都可以使用。
- 访问历史命令的方法:
- 使用history命令访问
- 使用fc命令访问
- 使用vi编辑器访问
五、引用
表 5.1 引用机制总结
引用 |
描述 |
‘…’ |
去除单引号中所有特殊字符的含义 |
“…” |
去除双引号中$、’、和\之外其他字符的含义 |
\c |
去除字符c的特殊含义:在双引号中能够去除\之后的$、’、”、换行符和\的特殊含义;如果是一行最后一个字符,可用作续行 |
`command`或$(command) |
执行command命令,并将标准输出插入到当前引用的位置上 |
六、波浪符替换
- Shell会检查命令行中的每一个单词及变量是否以未引用的~开头,如果是这样,将单词或变量中其余直到/的部分视为登录名,并在系统文件/etc/passewd中查找该用户。如果存在,使用主目录名替换~以及登录名。如果不存在,则不做任何修改。单独的~或/之后的~会被HIME变量所替换。
七、算数表达式
- 一般格式为:$((expression))
- Shell会对整数算数表达式expression求值。expression中可以包含常量、Shell变量(不需要使用美元符号)以及操作符。按照优先级由高到低的次序。
+、-、*、/、% |
加、减、乘、除、求余 |
~ |
按位取反 |
! |
罗辑反 |
<< 、>> |
左移,右移 |
<=、>=、<、> |
比较 |
==、!= |
等于,不等于 |
& |
按位与 |
^ |
按位异或 |
| |
按位或 |
&& |
逻辑与 |
|| |
逻辑或 |
expr1?expr2:expr3 |
条件运算符 |
=、*=、/=、%= |
赋值 |
+=、<<=、&¥62;>= |
$=、^=、|=、 |
- 括号可以改变操作符的优先级
- 如果最后一个表达式的结果非0,则退出状态码为0;如果最后一个表达式结果为0,则退出状态码为1(假)
八、文件名替换
- 在命令执行过参数替换和命令替换之后,Shell会查找特殊字符*、?、和[,如果他们没有被引用,Shell会搜索当前目录和其他目录(如果这些符号前有/) ,将替换成所有匹配的文件名,如果没有发现匹配,就不对这些字符做任何改动。
- 以.开头的文件必须明确的进行匹配(也就是说,echo*并不会显示隐藏文件,而echo.*)
表 8.1 文件名替换字符
字符 |
含义 |
? |
匹配单个任意字符 |
* |
匹配零个或多个任意字符 |
[chars] |
匹配chars中的任意单个字符,c1-c2可以匹配范围在c1到c2之间(包括c1和c2)的任意单个字符 |
[!chars] |
匹配不在chars中的任意单个字符 |
九、I/O重定向
表 9.1 I/O重定向
写法 |
含义 |
< file |
将标准输入重定向到file |
> file |
将标准输出重定向到file,如果file文件不存在,则创建,如果存在,将已有的内容全部清空 |
>| file |
将标准输出重定向到file。如果file不存在,则创建;如果存在。将已有内容全部清空。忽略set命令的noclobber(-c)选项 |
>> file |
和>类似,只不过如果file存在的话,会将输出追加到文件的尾部 |
>> word |
比较复杂,先不做解释 |
<& dight |
将标准输入重定向到与文件描述符dight相关联的文件 |
>& dight |
将标准输出重定向到与文件描述符dight相关联的文件 |
<&- |
关闭标准输入 |
>&- |
关闭标准输出 |
<>file |
打开file进行读取和写入 |
- 文件表述符0、1、2分别对应标准输入,标准输出,标注错误
十、导出变量与子Shell的执行
- 除了Shell内建命令的之外的其他命令通常都是在一个全新的Shell中执行的,我们称其为子Shell。子Shell无法改变父Shell中的变量,它只能访问从父Shell中导出的变量,如果子Shell修改了这些变量的值并希望自己的子Shell能够知晓,它必须在启动子Shell之前明确的将变量导出。
- 当子Shell执行完毕时,它所创建的变量无法再访问
- 小括号(…)中可以放入一条或多条命令,这些命令会在子Shell中执行
- 花括号{…;}中放入一条或多条命令,这些命令会在当前Shell中执行。
十一、作业控制
- 在后台运行的每一个命令序列都会被分配一个从0开始的作业编号,可以使用作业id来引用某个作业,作业id的形式有多种:
- kill、fg、bg、和wait、这些内建命令都可以使用作业id作为参数
- %+和%-分别表示当前作业和上个作业
- %%也可引用当前作业,当前作业是最近被置入后台的作业或者正运行在前台的作业
- %string引用的是名字以string起始的作业
- %?string引用的是名字中包含string的作业
- jobs命令可以列出当前运行的作业的状态
- 如果启用set 的monitor
- fg命令可以将后台作业或已停止的作业待会前台
- bg命令可以将已停止的作业植入后台
转载自blog.csdn.net/qq_41357573/article/details/82186775