Linux下的shell程序命令与脚本规范

1 shell简述

Shell可以使用文件名扩展字符,可直接使用shell内置命令。可使用数据流,提供通配符(*,?,[ ])、输入输出重定向、管道线等机制,shell程序可在后台执行命令,shell也是一种高级程序设计语言。Shell有sh、csh、ksh、bash等,这里介绍bash
Shell中#为注释符,如#!/bin/bash表示脚本解释语言为bash
Shell脚本的执行方式:
1) 输入重定向方式:让shell从指定脚本读入命令行,即 bash < 脚本名

2) 脚本名作为bash参数,可进行程序调试:形式为$bash 脚本名 [参数]

3) 将shell脚本的权限设置为可执行,后可在提示符下直接执行:
c h m o d a + x a a 后 chmod a+x aa后 chmoda+xaaPATH=$PATH . 后 $ aa即可执行脚本aa

2 history命令

格式:history [option] [arg…]
使用:如不带任何参数,history命令会显示历史命令清单(带有历史事件号);如果后面带一个正整数n,则显示历史表的最后n行命令;如果后面带一个文件名,则作为历史文件名。(重复过去的命令,也可以使用键盘的上下方向键对应查阅前一条或后一条命令)
常用选项:-a(在历史文件中添加“新“历史命令行)、-n(读取尚未读入的命令行并添加到当前历史清单中)、-r(读取历史文件内容,并将其作为当前历史命令)、-w(把当前的历史写入到历史文件中,覆盖原有内容)、-c(删除历史清单中的所有项)
执行历史命令是命令替换方式之一,以字符“!“开头。举例:!!(重复上一条命令,即”!-1“)、!n(重新执行第n条历史命令)、!-n(重新执行倒数第n条历史命令)、!string(重新执行以字符串string开头的最近的历史命令行)、!?string?(重新执行最近的其中包含字符串string的那条历史命令)、!#(到现在为止所输入的整个命令行)
历史文件中能保留的命令个数有限,默认是500。可利用HISTSIZE变量重新设定该值。通过HISTFILE赋值可改变存放历史命令的文件。例如HISTSIZE=300 HISTFILE=“/home/mengqc/.myhistory“

3 名称补全

方法:输入目录名或者文件名的开头部分时,然后按Tab键,Linux会自动补全剩余部分。如果输入过程中不知道后面的字符且系统也无法唯一确定名称的情况下,可以先按Esc键,再按?键,shell会列出匹配项。按Esc+?键的操作可以用连按两次Tab键来替代。

4 别名

格式:alias [name[=vlaue]]…,name时用户定义的别名名称,value是别名代替的内容(常用单引号括起来)。

取消别名:unalias name…,可以用unalias -a删除别名表中所有的别名

5 特殊字符

5.1 通配符

一般通配符
(1)*—匹配任意字符的0次或多次出现(文件名前的圆点(.)和路径名中的斜线符(/)必须显式匹配)

(2)?—匹配任意一个字符

(3)[字符组]—匹配该字符组限定的任何一个字符,如f[abcd]可匹配fa、fb、fc、fd,但不能匹配f1、fa1、fab。f[abcde]与f[a-e]相同

(4)!—如f[!1-9]匹配的是除f[1-9]之外的fa、fb等

模式表达式
(1)(模式表)——匹配给定模式表中0次或多次出现的“模式“。如file(.c | .o),匹配file、file.c、file.c.o等等文件

(2)+(模式表)——匹配给定模式表中一次或多次出现的“模式“。如file*(.c | .o),匹配file.c
、file.o、file.c.o等等文件,但不匹配file

(3)?(模式表)——匹配给定模式表中一次或0次出现的“模式“。如file*(.c | .o),只匹配file.c、file.o、file文件

(4)@(模式表)——匹配给定模式表中仅一次出现的“模式“。如file*(.c | .o),只匹配file.c、file.o文件

(5)@(模式表)——除了给定模式之外,可匹配其他任何东西

5.2 引号

双引号
由双引号括起来的字符(除“KaTeX parse error: Can't use function '\)' in math mode at position 14: “、倒引号(`)和反斜线(\̲)̲之外),均作为普通字符,这里““表示变量替换,即用预先指定的变量值代替KaTeX parse error: Can't use function '\)' in math mode at position 22: …号(`)表示命令替换。反斜线(\̲)̲仅当其后字符是”“ ”`“ “”” ”\“或者换行符之一时,反斜线符才是转义字符
单引号
由单引号括起来的字符都作为普通字符
倒引号
倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个倒引号部分。
反斜线符
转义字符,能将特殊字符转化成普通字符。未用单引号引起的反斜线符和换行符组合,作为续行符使用

5.3 输入/输出重定向符

1)输入重定向符
输入重定向符(<)的作用是:把命令(或可执行程序)的标准输入重新定向到指定文件。输入重定向的一般形式为:命令<文件名

2)输出重定向符
输出重定向符(>)的作用是:把命令(或可执行程序)的标准输出重新定向到指定文件。输出重定向的一般形式为:命令>文件名

3)输出附加定向符
输出附加定向符(>>)的作用是:把命令(或可执行程序)的标准输出附加到指定文件的后面,而文件原本的内容不被破坏。输出附加定向的一般形式为:命令>>文件名

4)即时文件定向符
即时文件由重新定向符(<<)、一对标记符以及若干输入行组成,可将shell程序的输入行重新定向到一个命令,形式为:
命令 [参数] << 标记符
输入行

标记符是能够明显识别的符号,如!!、%、“等,通常第一个标记符标记输入行开始,第二个标记符作为即时文件的结束标记(或者遇到文件末尾也可以结束即时文件)

5)与文件描述字相关的重定向
在Linux系统中,每一个“打开”的文件都有系统赋予的一个文件描述字,它是一个小整数(可以直接用这个描述字来引用对应文件)。通过:命令 $>file 这个可以将命令的标准输出和标准错误输出都放到同一个文件file中。
Shell处理重定向时是从左到右进行的,与重新定向有关的文件描述字是0-9,共10个文件描述字。用户可以随意定义且使用的是3-9。0、1、2分别对应标准输入、标准输出、标准错误输出。例如“2&> 1”表示把标准错误输出重定向到标准输出。

5.4 其他辅助命令

1)注释
Shell中以#作为注释符,一般shell脚本开头的第一行“#!”后面跟的字符串是所使用的shell的绝对路径名,说明脚本的解释程序

2)管道线
管道线是由竖杠(|)隔开的若干命令组成的序列。在管道线中,每个命令执行时都有一个独立的进程。前一个命令的输出正是下一个命令的输入。管道线中有一类命令称为过滤器,过滤器首先读取输入,然后将输入以某种简单方式进行变换(相当于过滤),再将处理结果输出。如grep、sort、tail、wc命令等就是过滤器。例如 ls | grep m?.c | wc -l 这个命令,显示的是当前目录中文件是以m打头,后随一个字符的所有C语言文件的数目

3)后台命令
即在要执行的命令的最后输入&符,即可告诉shell在后台运行该命令。而shell则马上显示主提示符以提醒用户可以输入新的命令。通常规定,后台进程的调度优先级都低于前台进程的优先级。所以仅当CPU空闲时,才调度后台进程运行。

5.5 命令执行操作符

多条命令在一行中出现,可以顺序执行,也可以在相邻命令件存在逻辑关系。
1) 顺序执行
多行命令可以通过分号间隔写成一行,皆为顺序执行。即
pwd
ls -l
与pwd; ls -l; 是等价的

2) 逻辑与
格式:命令1 && 命令2,这里后一个命令是否能执行取决于前一个命令执行成功与否。&&的优先级低于&

3) 逻辑或
格式:命令1 || 命令2,这里则是先执行命令1,若成功则不执行命令2;若失败则会执行命令2。 ||的优先级低于|

5.6 成组命令

Shell中的组合命令有两种方式:用花括号{}和圆括号()括起来的。使用{}时,左括号后应该有一个空格,右括号前应有一个分号。{}中的命令表必须用分号或者换行符终止。使用()时则没有上述约束。
二者的区别在于:用{}括起来的成组命令只在本shell内执行命令表,不产生新的进程;而用()括起来的数字哎新的子shell内执行,要建立新的子进程。所以,在()内等命令不会改变父shell的变量值及工作目录等

6 shell变量

Shell有两类变量:环境变量与临时变量。环境变量是永久性变量,其值不会因shell脚本执行结束而消失;临时变量是在shell程序内部定义的,适用范围仅限于定义它的程序。

6.1 自定义变量

命名方式与C语言的定义一致,shell中是用变量来存放字符串,一般形式为:变量名=字符串。Shell中引用变量的值是要在变量名前加一个 符 。 如 变 量 的 值 要 出 现 在 一 字 符 串 的 结 尾 , 可 直 接 引 用 ( 即 符。如变量的值要出现在一字符串的结尾,可直接引用(即 可<

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值