当前位置: 首页 > news >正文

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]*


http://www.mrgr.cn/news/63741.html

相关文章:

  • 奥数与C++小学四年级(第十八题 小球重量)
  • excel的宏1
  • 2024 年河南省高等职业教育技能大赛实施方案概述
  • 智能指针(内存泄漏问题)
  • JavaScript网页设计案例:智慧社区可视化大屏的实现
  • 如何使用和打开jconsole
  • 基于Python的黑龙江旅游景点数据分析系统【附源码】
  • Qml-Gif的显示
  • C语言结构体 变量对齐原理
  • MySQL-如果你在添加外键时忘加约束名,如何找到系统默认的约束名
  • vue2开发 对接后端(go语言)常抛异常情况以及处理方法汇总
  • 智能合约中的AI应用
  • 构造小练习
  • 最逼真的AI换脸软件,Pluse下载介绍(可直播)
  • LeetCode994. 腐烂的橘子(2024秋季每日一题 54)
  • C++ 模版(初阶)
  • Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)
  • 高清解压视频素材从哪儿下载?推荐5个高清推文素材资源网站
  • Excel:vba实现插入图片
  • Pandas CSV学习