shell脚本概述
1.1 shell概述
shell是一个用C语言编写的程序,它是用户使用linux的桥梁。shell既是一种命令语言,又是一种程序设计语言。
1.2 shell脚本结构
1、开头:#!/bin/sh或#!/bin/bash 符号#!用来告诉系统,这个脚本需要什么解释器来执行。
2、注释:以#开头的行表示注释。
3、命令行的书写规则:一行一条命令 若一行多个命令,用(;)来分割,长命令可以使用反斜线字符(\)分割。
1.2.1shell脚本的创建
打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,如果用php写shell脚本,扩展就用php就可以。
最简单的输出:
#!/bin/bash
echo "Hello World !"
上面这是执行脚本的一种方式
第二种方式:
1.3 变量
1.3.1 系统变量
系统定义的变量 | 意义 |
BASH=/bin/bash | Bash Shell 名称 |
BASH_VERSION=4.1.2(1) | Bash版本 |
HOME=/home/linuxtechi | 用户家目录 |
LOGNAME=Linuxtechi | 当前登录用户的名字 |
OSTYPE=Linux | 操作系统的类型 |
PATH=/usr/bin:/sbin/:/bin:/usr/sbin | 可执行文件搜索路径 |
PWD=/home/linuxtechi | 当前工作目录 |
SHELL=/bin/bash | Shell名称 |
USERNAME=linuxtechi | 当前登录的用户名 |
1.3.2 自定义变量
命名变量:
变量名=变量值
name=lny
echo $name
lny
1.3.3 特殊变量
特殊变量 | 含义 |
$$ | Shell本身的PID |
$! | Shell最后的运行后台process的PID |
$? | 最后运行的命令结束代码(返回值) |
$- | 使用set命令设定的flag一览 |
$* | 所有参数列表。如"$*"用["]括起来的情况、以"$1 $2...$n"的形式输出参数 |
$@ | 所有参数列表。如"$@"用["]括起来的情况、以"$1""$2"..."$n"的形式输出所有参数。 |
$# | 添加到shell的参数个数 |
$0 | shell本身的文件名 |
$1~$n | 添加到shell的各参数值。$1是第1参数、$2是第2参数..。 |
PID是进程控制符,是属于各进程的身份标识,程序一运行系统就会自动分配给进程独一无二的PID,进程中止PID会被系统自动回收,可能会被继续分配给新运行的程序。
#!/bin/bash
echo "Shell 传递参数实例!"
echo "执行的文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
chmod +x test.sh
./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh 1 2 3
第一个参数为:1
第二个参数为:2
第三个参数为:3
1.3.4 变量赋值
变量的赋值使用 "="
例子:
x=6
a="welcome to beijing"
引号的区别
单引号(' '):所有转义符全部关闭,完整的展现出引号中的原始内容。
双引号(" "):部分转义符关闭,但某些则保留(如:$)
反引号(` `): 反引号中内容作为一个系统命令并执行(结合了传参的方式)
1.3.5 变量的调用
在变量名面前加一个$符号
name=linux
echo $name
linux
1.3.6 read从键盘读入内容
用法:
read -p "提示信息" username
read -p "请输入用户名:" username
read -p "请输入密码:" password
echo -e "Login success,Welocome,$username"
1.4 cut、sort、uniq、wc命令详解
1.4.1cut
linux cut命令用于显示每行开头算起num1到num2的文字
参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
实例:
1、显示/etc/grub.conf里第1个字符
cut -c1 /etc/grub.conf
2.显示/etc/grub.conf里第1个到第20个字符
cut -c1-20 /etc/grub.conf
3.显示/etc/passwd里,以冒号分隔的第1列到第3列
cut -d':' -f1-3 /etc/passwd
4.显示/etc/passwd里,以冒号分隔的第1列和第3列
cut -d':' -f1,3 /etc/passwd
1.4.2 sort
linux sort命令用于将文本文件内容加以排序。
sort可针对文本文件的内容,以行为单位来排序。
参数 | 含义 |
-b | 忽略每行前面开始的空格字符 |
-c | 检查文件是否已经按照顺序排序 |
-d | 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 |
-f | 排序时,将小写字母视为大写字母 |
-i | 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。 |
-m | 将几个排序好的文件进行合并 |
-M | 将前面3个字母依照月份的缩写进行排序 |
-n | 依照数值的大小排序 |
-o<输出文件> | 将排序后的结果存入指定的文件 |
-r | 以相反的顺序来排序 |
-u | 去除重复行 |
-t<分割字符> | 指定排序时所用的栏位分割字符 |
+<起始栏位>-<结束栏位> | 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。 |
例子
1、查看/etc/passwd里的内容并且正向排序
sort /etc/passwd
2、去除重复行
3、反向排序
sort默认的排序方式是升序(不识别十位数)
4、将排序的内容输出到指定的文件
5、按照数值大小排序
6、sort -t和-k的用法
根据第二列数据进行排序
1.4.3 uniq
参数 | 含义 |
-i | 忽略大小写字符的不同 |
-c | 进行计数 |
-u | 只显示唯一的行 |
例子:
1、排序之后删除了重复行,同时在行首位置输出该行重复的次数
sort 11.txt | uniq -c
2、仅显示存在重复的行,并在行首显示该行重复的次数
sort 11.txt | uniq -dc
3、仅显示不重复的行
sort 11.txt | uniq -u
1.4.4 wc
wc命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
参数 | 含义 |
-c | 显示文件的Bytes数(字节数)及文件名输到屏幕上 |
-l | 将每个文件的行数及文件名输出到屏幕上 |
-m | 将每个文件的字符数及文件名输出到屏幕上,如果当前系统不支持多字节字符将其显示与-c参数相同的结果 |
-w | 将每个文件含有多少个词及文件名输出到屏幕上 |
-L | 显示最长一行字符数 |
例子:
wc -l /etc/passwd
22 /etc/passwd
cat /etc/passwd | wc -l
25
echo `123456` | wc -L
6
1.5 find文件查找工具
1.5.1find工具详情
参数 | 说明 |
-type | 类型 |
-name | 以什么*命名的 |
-iname | 以参数的效果和指定“-name”参数类似,但你忽略字符大小写的差别 |
-mtime | 修改时间 |
-ctime | 创建时间 |
-maxdepth | find命令查找的最大深度(tree -L 1 -d) |
-size | 文件大小(大于1M是+1M) |
-perm | 按照文件权限来查找文件 |
-user | 按照文件属主来查找文件 |
-group | 按照文件所属的组来查找文件 |
-inum | 根据inode号查找文件 |
查找文件
find ./ -type f
查找目录
find ./ -type d
查找名字为test的文件或目录
find ./ -name test
查找文件名匹配*.c的文件
find ./ -name '*.log'
打印test文件名后,打印test文件的内容
find ./ -name test -print -exec cat {} \;
不打印test文件名,只打印test文件的内容
find ./ -name test -exec cat {} \;
查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
查找空文件并删除
find ./ -empty -type f -print -delete
查找权限为644的文件或目录(需完全符合)
find ./ -perm 664
查找有执行权限但没有可读权限的文件
find ./ -executable \! -readable
查找文件size小于10M的文件或目录
find ./ -size -10M