什么是shell
shell是一个程序,采用c语言编写,是用户和linux内核沟通的桥梁,它是一个解释形的语言
shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文件中,然后给予执行权限
1.如何书写一个shell
- 名字要有意义
- shell脚本开头必须指定脚本运行环境以#!这个特殊符号组合来组成。如#!/bin/bash指定该脚本是运行解析/bin/bash来完成的
- #代表注释,#!在shell中一个组合,代表脚本运行的环境
脚本组成
- 解释环境 #!/usr/bin/evn bash | python | perl
- 注释信息
- 执行代码
2.如何运行一个shell脚本
- 给予执行权限
- 解释器直接运行
3.shell中的特殊符号
~ 代表home目录
- 代表上一层目录
!! 代表上一次命令
$ 去变量内容符
+ - * / % 加减乘除、取余数
& 后台执行
* 匹配所有
? 匹配一个字符
;分号可以在shell中一行执行多个命令,命令之间用分号分割
| 管道,上一命令的输出作为下一个命令的输入
\ 转义字符
`` 在命令中执行命令 echo `pwd`
'' 字符串单引号,不解释变量
"" 解释变量
$? 用来判断上一个结果的正确性
4.shell重定向
> 重定向输入 覆盖原数据
>> 重定向追加输入,在原数据的末尾添加
< 重定向输出 wc -l < /etc/passwd
<< 重定向追加输出
5.退出脚本
exit NUM 退出脚本,释放系统资源,NUM代表一个整数,代表返回值(1-255)
5.1 shell格式化输出
一个程序需要有0个或以上的输入、一个或更多的输出
5.2 echo命令介绍
功能:将内容输出到默认显示设备,一般起到一个提示的作用
语法:echo[-ne][字符串],-n不要在最后自动换行,-e出现特殊字符进行特殊处理,如
1. \a发布警告声
2. \b删除前一个字符
3. \t插入tab
4. \r光标移至行首,但不换行
shell实现倒计时
#!/bin/bash
for time in `seq 0 -10`;do
echo -n -e "\b$time"
sleep 1
done
5.3 read命令
功能:默认接受键盘的输入,回车符代表输入结束
read 命令选项
-p 打印信息
-t 限定时间
-s 不回显
-n 输入字符个数
6.常用函数
6.1 cut
cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容,类似于下的type命令。
6.1.1 选项
cut(选项)(参数)
-b:仅显示行中指定直接范围的内容;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。
6.1.2 案例
例如有一个学生报表信息,包含No、Name、Mark、Percent:
[root@localhost text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
使用 -f 选项提取指定字段:
[root@localhost text]# cut -f 1 test.txt
No
01
02
03
-f 1,3 按分隔符分列截取第1列和第3列
使用 -d 选项指定字段分隔符:
[root@localhost text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
[root@localhost text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex
6.2 字符串拼接
#!/bin/bash
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
运行结果:
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html
6.3 字符串删除
Shell中的${}、##和%%使用范例
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt