Shell常用语法记录

215 阅读2分钟

什么是shell

shell是一个程序,采用c语言编写,是用户和linux内核沟通的桥梁,它是一个解释形的语言

shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文件中,然后给予执行权限

1.如何书写一个shell

  • 名字要有意义
  • shell脚本开头必须指定脚本运行环境以#!这个特殊符号组合来组成。如#!/bin/bash指定该脚本是运行解析/bin/bash来完成的
  • #代表注释,#!在shell中一个组合,代表脚本运行的环境

脚本组成

  • 解释环境 #!/usr/bin/evn bash | python | perl
  • 注释信息
  • 执行代码

2.如何运行一个shell脚本

  1. 给予执行权限
  2. 解释器直接运行

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