shell脚本编程
1.shell的分类
-
Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。
-
Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数localhost发行版的默认的Shell。
-
Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。
-
C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。
如何查看当前系统支持的shell?
2.Shell脚本编写规范
如何快速生成脚本开头的版本版权注释信息
[root@ scripts]# cat ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"##############################################################")
call setline(3, "# File Name: ".expand("%"))
call setline(4, "# Version: V1.0")
call setline(5, "# Author: xx")
call setline(6, "# Email: xx@163.com")
call setline(7, "# Organization: http://www.xx.com/xx/")
call setline(8, "# Created Time : ".strftime("%F %T"))
call setline(9, "# Description:")
call setline(10,"##############################################################")
call setline(11, "")
endif
endfunc
3.shell脚本执行
方法一:当前目录下./a.sh 文件需要执行权限
方法二:绝对路径 /test/a.sh 文件需要执行权限
方法三:用sh 或bash来执行 bash a.sh 文件不要执行权限 ---建议使用方法
方法四:用source a.sh 或 . a.sh 执行会开启子shell 文件不要执行权限 (一般不用 vim /etc/init.d/network )
区别:
1、方法三:可以在脚本中不指定解释器,脚本可以没有执行权限
2、方法一和方法二脚本需要有执行权限,./script_name.sh 或/path/script_name.sh bash a.sh
3、方法四:当前shell执行,方法1-3开启子shell
自定义脚本
写脚本:show_info.sh
输出: 当前系统时间是:xxxx
输出: 当前用户: $USER
vim tab键的缩进为4个空格
"add by school1024.com` set ts=4 set softtabstop=4 set shiftwidth=4 set expandtab set autoindent ts是tabstop的缩写,设TAB宽度为4个空格。 softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。 shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 expandtab表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。 autoindent自动缩进
4.shell特性回顾
1.echo linux打印命令
选项:-n 取消输出后行末的换行符号
-e 支持反斜线控制的字符转换 \n \t
[root@localhost ~]# echo -e "\e[1;31m abed \e[0m"
echo -e "\033[1;31;42m abcd \033[0m"
这条命令会把 abcd 按照红色输出。
解释一下这个命令:\e[字体控制选项;字体背景颜色;文字颜色m 字符串 \e[0m 代表颜色输出结束
文字颜色:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37m=白色。
字体背景色:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。
字体控制选项:1表示高亮,4表示下划线,5颜色闪烁
2.printf
printf 命令模仿 C 程序库(library)里的 printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
printf format-string [arguments...]
参数说明:
-
format-string: 为格式控制字符串
-
arguments: 为参数列表。
实例
$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell**\n**"
Hello, Shell
$
接下来,我来用一个脚本来体现 printf 的强大功能:
实例
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
实例
printf "%d %s\n" 1 "abc"
# 单引号与双引号效果一样*
printf '%d %s\n' 1 "abc"
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替*
printf "%s and %d \n"
执行脚本,输出结果如下所示:
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
3、命令执行顺序
; --命令的顺序执行 date; ls -l /etc/passwd
&&与 --前面命令执行不成功,后面的命令不执行 !id haha && useradd haha
||或--如果前面命令成功,后面就不执行,如果前面不成功后面就执行
! 非
4、通配符 (文件名通用匹配)
通配符是系统命令使用,一般用来匹配文件名或者什么的用在系统命令中。而正则表达式是操作字符串,以行尾单位来匹配字符串使用的
? 匹配一个任意字符
`*` 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。
[a-z] 匹配中括号中任意一个字符, -代表一个范围。
[^a-z] 逻辑非,表示匹配不是中括号内的一个字符。
[a-z] [0-9] [a-zA-Z] [^0-9a-zA-Z]
[[:class:]]:匹配一个属于指定字符类中的字符,[:class:]表示一种字符类,比如数字、大小写字母等。
常用字符类:
[:alnum:] :匹配任意一个字母或者数字 ,传统UNIX写法: a-zA-Z0-9
[:alpha:] :匹配任意一个字母,传统UNIX写法: a-zA-Z
[:digit:] :匹配任意一个数字,传统UNIX写法: 0-9
[:lower:] : 匹配任意一个小写字母,传统UNIX写法: a-z
[:upper:] : 匹配任意一个大写字母,传统UNIX写法:A-Z
[:space:] :空白字符
[:punct:] : 标点符号
注意事项:在使用专属字符集的时候,字符集之外还需要用 [ ] 来包含住,否则专用字符集不会生效,例
如 [[:space:]]
[root@HAHA ~]# grep '[[:upper:]]' a
AAA
BBB
CCC
通配符常用语法:
1、匹配任意长度的任意字符,就是说“什么都可以”。
/etc/fs* #/etc中以fs开头的文件将被匹配
/tmp/my*1 #/tmp中以my开头并且以1结尾的文件将被匹配
2、?:与任何单个字符匹配。
myfile? #文件名为myfile且后面跟任一单个字符的任何文件将被匹配 /tmp/notes?txt
#如果/tmp/notes.txt和/tmp/notes_txt都存在的话他们都会被匹配
3、[ ]:与?相似,可以匹配一个括号内的字符,也可以用“-”进行范围指定。
myfile[12] #将与myfile1和myfile2匹配
[Cc]hange[Ll]og #Changelog、ChangeLog、changeLog以及changelog都可匹配,与大写形式的 变形匹配时,使用括弧通配符很有用 ls /etc/[0-9]
#将列出 /etc 中以数字开头的所有文件。
ls /tmp/[A-Za-z] #将列出/tmp中以大写字母或小写字母开头的所有文件。
4、[!]:括号内的“!”代表非的意思,即不与括弧中的字符匹配。
rm myfile[!9] #删除除了myfile9之外的名为myfile加一个字符的所有文件
5、{}生成序列
touch file{1..9}.txt
#当前路径生成file1.txt~file9.txt。{a..f}代表a-f,不连续的使用,分 隔,比如f{1,3,5}.txt
6、使用{}备份
cp file1.txt{,.bak} #将fiel1.txt复制一份叫file1.txt.bak
cp file{2,22}.txt #复制file2.txt为file22.txt
示例:
1、列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[!a-n]*.conf
2、列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[a-n]*.conf
3、列出/bin/下以 c或k开头的文件名
ls /bin/[ck]*