Linux中Shell基础知识梳理

一、命令

  1. 程序名与参数之间要用空白字符分隔,通常是空格,制表符或换行符
  2. 同一行上可以输入多条命令,命令之间用分号;分隔
  3. 执行的每条命令都会返回一个叫做状态码的数字,其中0表示执行成功,非0表四故障,不同的数字代表不同的含义
  4. 管道符|用于将一个命令的标准输出连接到另一个命令的标准输入,其退出状态码是管道中最后一个命令的退出状态码,在管道前放上!会将最后一个命令退出状态码的逻辑反作为管道的退出状态码
  5. 如果命令序列是以&作为结尾,它会将在后台以异步方式运行。shell会在终端显示其进程ID和作业编号,并提示输入下一条交互式命令
  6. 如果命令最后一行是字符反斜杠,那么可以在下一行继续输入命令
  7. &&字符仅在其之前的命令返回为0的退出状态码时才执行之后的命令,||字符仅在其之前的命令反回非0的退出状态码时才执行之后的命令
  8. 仅当grep返回为0的退出状态码时才执行echo

二、注释

  • 如果行中出现注释符#,Shell会将剩余的部分视为注释并将其忽略,不在进行解释,替换和执行

三、参数与变量

  • 有三种不同类型的参数:Shell变量,特殊参数及位置参数

Shell变量

  1. Shell变量必须以字母或下划线_开头,之后可以是任意的字母、数字和下划线
  2. 可以在命令行上给Shell变量进行赋值

位置参数

  1. 当Shell执行程序时,程序名被赋给变量0,命令行上输入的参数分别赋给 1 , 2,$3,可以使用set命令为位置参数赋值。位置参数1~9可以直接引用,大于9的位置参数必须放在花括号中,&#36{10}

特殊参数

表 3.1 特殊的参数变量
参数 含义
$# 传递给程序的参数数量或者由set语句设置的参数数量
$* 引用所有的位置参数
$@ ( " @”)是以” 1 " " 2”、”$3”的形式来引用所有的位置参数
$0 所执行的程序名
$$ 所执行程序的进程
$! 送入后台执行的最近的一个程序的进程ID
$? 最近执行的非后台命令的推出码状态
$- 生效的当前选项标志
表 3.2 Shell使用的其他变量
参数 含义
PS1 主命令提示符,通常是”$”
PS2 辅命令提示符,通常是”>”
PS4 跟踪模式下的提示符,通常是”+”
PWD 当前工作目录的路径
HISTSIZE 如果设置,则制定了可保存的先前输入过的命令的数量

参数替换

  • 在最简单的情况下,可以通过在参数前面加上美元符号$来访问参数的值。
表 3.3 参数替换
参数 含义
p a r a m e t e r {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编辑器访问

五、引用

  • Shell能识别四种不同的引用机制
表 5.1 引用机制总结
引用 描述
‘…’ 去除单引号中所有特殊字符的含义
“…” 去除双引号中$、’、和\之外其他字符的含义
\c 去除字符c的特殊含义:在双引号中能够去除\之后的$、’、”、换行符和\的特殊含义;如果是一行最后一个字符,可用作续行
`command`或$(command) 执行command命令,并将标准输出插入到当前引用的位置上

六、波浪符替换

  • Shell会检查命令行中的每一个单词及变量是否以未引用的~开头,如果是这样,将单词或变量中其余直到/的部分视为登录名,并在系统文件/etc/passewd中查找该用户。如果存在,使用主目录名替换~以及登录名。如果不存在,则不做任何修改。单独的~或/之后的~会被HIME变量所替换。

七、算数表达式

  • 一般格式为:$((expression))
  • Shell会对整数算数表达式expression求值。expression中可以包含常量、Shell变量(不需要使用美元符号)以及操作符。按照优先级由高到低的次序。
+、-、*、/、% 加、减、乘、除、求余
~ 按位取反
罗辑反
<< 、>> 左移,右移
<=、>=、<、> 比较
==、!= 等于,不等于
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
expr1?expr2:expr3 条件运算符
=、*=、/=、%= 赋值
+=、<<=、&¥62;>=
$=、^=、|=、
  • 括号可以改变操作符的优先级
  • 如果最后一个表达式的结果非0,则退出状态码为0;如果最后一个表达式结果为0,则退出状态码为1(假)

八、文件名替换

  1. 在命令执行过参数替换和命令替换之后,Shell会查找特殊字符*、?、和[,如果他们没有被引用,Shell会搜索当前目录和其他目录(如果这些符号前有/) ,将替换成所有匹配的文件名,如果没有发现匹配,就不对这些字符做任何改动。
  2. 以.开头的文件必须明确的进行匹配(也就是说,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的执行

  1. 除了Shell内建命令的之外的其他命令通常都是在一个全新的Shell中执行的,我们称其为子Shell。子Shell无法改变父Shell中的变量,它只能访问从父Shell中导出的变量,如果子Shell修改了这些变量的值并希望自己的子Shell能够知晓,它必须在启动子Shell之前明确的将变量导出。
  2. 当子Shell执行完毕时,它所创建的变量无法再访问
  3. 小括号(…)中可以放入一条或多条命令,这些命令会在子Shell中执行
  4. 花括号{…;}中放入一条或多条命令,这些命令会在当前Shell中执行。

十一、作业控制

  1. 在后台运行的每一个命令序列都会被分配一个从0开始的作业编号,可以使用作业id来引用某个作业,作业id的形式有多种:
  2. kill、fg、bg、和wait、这些内建命令都可以使用作业id作为参数
  3. %+和%-分别表示当前作业和上个作业
  4. %%也可引用当前作业,当前作业是最近被置入后台的作业或者正运行在前台的作业
  5. %string引用的是名字以string起始的作业
  6. %?string引用的是名字中包含string的作业
  7. jobs命令可以列出当前运行的作业的状态
  8. 如果启用set 的monitor
  9. fg命令可以将后台作业或已停止的作业待会前台
  10. bg命令可以将已停止的作业植入后台

猜你喜欢

转载自blog.csdn.net/qq_41357573/article/details/82186775
今日推荐