Shell 脚本常用命令
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell脚本是Linux开发工作中常用的工具,整理如下:
1 Shell中的特殊符号
1.1 $ 美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。
1.2 # 井号。除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。
1.3 “” 双引号。shell不会将一对双引号之间的文本中的大多数特殊字符进行解释,如#不再是注释的开头,它只表示一个井号“#”。但$仍然保持特殊含义。(在双引号中的$加变量名,即:$PARAM_NAME,依然会转换成变量的值。)
1.3.1 双引号对于某些特殊符号是不起作用的, 例如:”,$,\,`(反引号)
1.3.2 双引号和单引号不能嵌套。即:echo ‘””’ 输出””, echo “’’” 输出’’
1.4 ‘’ 单引号。shell不会将一对单引号之间的任何字符做特殊解释。(在双引号中的$加变量名,即:$PARAM_NAME,不会转换成变量的值。)
1.4.1 echo “$HOME” (结果:/home/xiongguoan)
1.5 `` 倒引号。命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。
1.5.1 echo ‘$HOME’ (结果:$HOME)
1.6 \ 斜杠。用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。
1.7 []中括号, 主要是用来测试条件的,通常放在if语句的后面。 (不过还是不太明白),但是中括号本身不会在测试语句执行后消失。
1.7.1 echo [$HOME] (结果:出现错误)
1.7.2 echo [$HOME ] (结果:[/home/xiongguoan ]) (注意:HOME后面有空格哦。)
1.7.3 echo [$HOME –eq ‘/xiong’] (结果:[/home/xiongguoan –eq /xiong])
1.8 {}大括号,主要是和$符号配合,作为字符串连接来使用
1.8.1 echo ${HOME}ismydir (结果:/home/xiongguoanismydir)
2 预定义的变量
2.1 特殊变量
$ shell变量名的开始,如$var
| 管道,将标准输出转到下一个命令的标准输入
$# 记录传递给Shell的自变量个数
# 注释开始
& 在后台执行一个进程
? 匹配一个字符
* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
$- 使用set及执行时传递给shell的标志位
$! 最后一个子进程的进程号
$? 取最近一次命令执行后的退出状态(返回码)
$* 传递给shell script的参数
$@ 所有参数,个别的用双引号括起来
$0 当前shell的名字
$n (n:1-) 位置参数
$$ 进程标识号(Process Identifier Number, PID)
> 输出重定向
< 输入重定向
>> 输出重定向(追加方式)
[] 列出字符变化范围,如[a-z]
2.2 代值变量
* 任意字符串
? 一个任意字符
[abc] a, b, c三者中之一
[a-n] 从a到n的任一字符
2.3 特殊字符的表达
\b 退回
\c 打印一行时没有换行符 这个我们经常会用到
\f 换页
\r 回车
\t 制表
\v 垂直制表
\\ 反斜线本身
2.4 其他字符
2.4.1 分号
; 表示一行结束
2.4.2 圆括号
() 表示在新的子shell中执行括号内的命令(这样可以不改变当前shell的状态。)
但是圆括号在单/双引号内失去作用,只作为普通字符。
2.4.3 花括号
2.4.3.1 分割命令的用法
与圆括号相似,但是:1. 花括号内的命令在当前shell中执行;2.花括号必须作为命令的第一个字符出现。
2.4.3.2 引用变量的用法
在$后面,表示变量名的开始和结束
2.4.4 方括号
相当与test命令,用来执行测试条件,通常用在需要判断条件的语句后面,例如:if,while等等。
3 设置变量
3.1 格式:VARNAME=value (i.e. PARAM=’hello’)
3.2 注意:
3.2.1 等号的前后不能有空格
3.2.2 如果变量的值是一个命令的执行结果,请加上反引号(`)。
diff
diff命令多用来比较两个文件或目录的不同。
1.diff比较文件不同
diff file file1 ##文件比较
2.diff在比较文件过程中显示结果的说明
[num1,num2][a|c|d][num3,num4]
num1,num2表示在第一个文件中的行数
a表示添加---add
c表示更改---change
d表示删除---delete
<表示第一个文件中的内容,>表示第二个文件中的内容,---分割线
num3,num4表示在第二个文件中的行数
2,4c2,4表示改变第一个文件中的第二行和第四行才能匹配第二个文件中的第二行和第四行
3.diff常用参数说明
-b 或 --ignore-space-change 不检查空格字符的不同
-B 或 --ignore-blank-lines 不检查空白行
-c 显示全部内文,并标出不同之处
-i 或 --ignore-case 不检查大小写的不同
-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称
-q 或 --brief 仅显示有无差异,不显示详细的信息
-r 或 --recursive 比较子目录中的文件
-u 已合并的方式来显示文件内容的不同
patch命令
yum install patch -y
diff -u test test1 > westos.path
patch test1 westos.path ##打补丁
cut命令多用于字符截取
cut -d ##指定分隔符
cut -f 1,7|1-7 ##指定截取的列
cut -c 1,4|1-4 ##指定截取的字符位置
示例:
cut -d : -f 1 passwd
cut -d : -f 1,3 passwd
cut -d : -f 1-3 passwd
cut -c 2-4 passwd
cut -c 2,4 passwd
sort
sort命令多用于字符排序
sort -n ##纯数字排序
sort -r ##倒序
sort -u ##去掉重复数字
sort -o ##输出到指定文件中
sort -t ##指定分隔符
sort -k ##指定要排序的列
example:
sort -n test ##安装数字大小排序,【sort test】按照第一个数字进行排序
sort -nr test
sort -nru test
sort -nru test -o westos
sort -t : -k 2 -n test
uniq
uniq命令多用于对重复字符进行处理
uniq -u ##显示唯一的行
uniq -d ##显示重复的行
uniq -c ##每行显示一次并统计重复次数
example:
sort -n test | uniq -c
sort -n test | uniq -d
sort -n test | uniq -u
test
test命令和[]等同
test "$A"=="$B" 等同 [ "$A" == "$B" ]
[ "$A" = "$B" ] ##等于
[ "$A" != "$B" ] ##不等于
[ "$A" -eq "$B" ] ##等于
[ "$A" -ne "$B" ] ##不等于
[ "$A" -le "$B" ] ##小于等于
[ "$A" -lt "$B" ] ##小于
[ "$A" -ge "$B" ] ##大于等于
[ "$A" -gt "$B" ] ##大于
["$A" -ne "$B" -a "$A" -gt "$B" ] ##A不等于B,且A大于B
["$A" -ne "$B" -o "$A" -gt "$B" ] ##A不等于B,或A大于B
练习:编写一个脚本,输入一个文件名,即可判断该文件的类型