Shell命令结构和规范

Shell命令结构和规范。

Shell命令结构和规范

Shell作为外围软件生态群其中一个非常重要的组件。它是操作系统最外层的接口,负责直接面向用户交互并提供内核服务,包括命令行接口(CLI)或图形界面接口(GUI)两种形式。以CLI为例,它提供一套命令规范,是一种解释性语言,将用户输入经过解释器(interpreter)输出使其转化成真正的系统调用,实现人机交互的功能。

命令结构和规范
Thompson Shell命令语言结构和规范的基础,其解释器具有跨平台的可移植性,并影响到了后来包括Bourne Shell在内的各种脚本语言设计实现。Bourne Shell的5个特性和命令规范,可以通过sh(1)手册查看原始资料。

过滤器/管道线(filter/pipeline)。这绝对是要载入Unix史册的发明,创立者是Douglas McIlroy,Thompson Shell引入并实现了这个伟大的概念——一个或多个命令组成一根过滤器的链条,由’|’或’^’符号分隔。除最后一个命令之外,每个命令的标准输出都被作为下一个命令的标准输入。这样每个命令都作为一个独立的进程来运行,并通过管道与邻近的进程相连接。圆括弧内的命令序列整体上可以替代单个命令作为过滤器实现,比如用户可以输入”(A;B)|C”。

命令序列和后台进程。分号’;’指示多个命令序列化执行。’&’符号指示该命令在后台异步执行,使得前面的管道线不必等待其终止,仅仅报告一个进程id,这样用户以后可以通过kill命令与它通信。有益于进程管理。

I/O重定向。它利用了Unix设计上的一个重要特性——一切皆文件,用三个符号表示:”重定向输出,如果文件不存在则创建它,如果文件存在则截断它;’>>’追加模式重定向输出,如果文件不存在则创建它,如果文件存在则追加输出至末尾处。

通配符扩展(globbing)。通配符的概念源自于正则表达式,使得解释器智能地处理用户不完全输入,比如记不清文件名、一次性输入多个文件等。’?’匹配任意单一字符;’*’匹配任意字符串(包括空串);成对’[‘和’]‘定义了字符集合一个类,可匹配方括号内任意成员,用’-‘两端可指定一系列连续字符匹配范围。

参数传递。这里主要引入了位置参数和选项参数的概念:’$n’指示shell调用的第n个参数替代;还定义了两个选项参数’-t’和’-c’,前者用于交互,导致shell从标准输入中读入一行作为用户执行的系统命令,后者指示shell将附带的下一个参数作为命令执行(可正确处理换行符),是对’-t’的补充,特别是调用者已经读取了命令其中某些字符的情况下。如果不带选项参数则直接读取文件名。

通配符(wildcard)

*: 代表任意个任意字符

?: 代表1个任意字符

[abc]:代表a或b或c中的一个

[a-z]: 代表 a~z这个范围

[^abc] : 代表除了a或b或c以外的字符

数据流重定向:

0: STDIN 标准输入

1: STDOUT 标准输出

2: STDERR 标准错误输出

>, >>: 输出流重定向, > 为 覆盖,>> 为追加

cat infile 1> outfile 2>&1

将 2 重定向到 1, 再将 1 重定向到 outfile 文件,意思是将标准错误输出和标准输出都存入outfile

find /home 2> /dev/null

将错误输出 /dev/null, /dev/null是垃圾黑洞,可以将信息忽略

< : 输入重定向

cat > catfile < ~/test

用 test 文件的内容代替STDIN输入到 catfile里

<<: eof符号

cat > catfile << ‘eof’

你可以使用STDIN(键盘输入)来输入到catfile,当输入eof时,输入结束,相当于点了 ctrl + d

命令执行依据 ; && ||

; : 顺序执行

&& : 且 逻辑, cmdA && cmdB, 只有cmdA成功了才会继续执行cmdB,成功的依据就是 $? 这个状态回传码

|| : 或逻辑, cmdA || cmdB 只有cmdA执行失败才会继续执行cmdB

管道(pipe | )

管道可以将前一个命令的stdout当作后一个命令的stdin,只有特定的管道命令才能使用

管道命令有 cut,grep,sort,wc,uniq,tee,tr,col,join,paste,expand等

而ls cd这些命令则不是管道命令,如果需要使用管道则需要用xargs作参数代换

- 号的用途

- 号可以代替 STDOUT STDIN

tar -czv -f - /home | tar -xzv -f -

第一个 - 代替stdout,第二个 - 代替stdin,想当于用tar来实现cp

算数运算

$((a*b)) : 计算a与b的乘积,只支持整数

变量操作

使用export将自定义变量转为环境变量

“:” 表示并列含义,例如A变量值有多个,用:符号进行分离。

作者

BaldStrong

发布于

2019-03-10

更新于

2022-02-22

许可协议

评论