shell交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令, 也就是一个可以将用户发出的操作命令解释给操作系统的一个应用程序
通配符 | 含义 | 实例 |
---|---|---|
* | 匹配 0 或多个字符 | a*b ,a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如 aabcb, axyzb, a012b, ab |
? | 匹配任意单个字符 | a?b ,a与b之间有且只有一个字符, 可以是任意字符, 如 aab, abb, acb, a0b |
[list] | 匹配 list 中的任意单个字符 | a[xyz]b ,a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如 axb, ayb, azb。 |
[!list] | 匹配除 list 中的任意单一字符 | a[!0-9]b ,a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如 axb, aab, a-b。 |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 | a[0-9]b ,匹配0与9之间其中一个字符,如 a0b, a1b... a9b |
{s1,s2,...} | 匹配 s1 或 s2 (或更多)中的一个字符串 | a{abc,xyz,123}b ,a与b之间只能是abc或xyz或123这三个字符串之一 |
#! 为shell与python 脚本语言的通用开头 英文念做 she bang
示例1.编写一个ping脚本,可以提示用户输入
#!/bin/bash
read -p "please input a ip" ip
ping -c1 $ip &>/dev/null
if [ $ip -eq 0 ] ;then
echo "$ip okkkkkkkkkkkkkkkkkk"
else
echo "$ip fialeddddddddddd"
fi
如上图shell中的变量赋值方式有三种
1.ip=xxx.xxx.xxx
2.read ip
3.$1
第一种是最简单的赋值方式,但是没有第二种使用read关键字读入变量更为方便
这里顺便介绍一个read关键字使用方式
第三种是shell的一种默认输入 $ 1,系统自动读入执行shell后的第一个参数
接下来看看变量的几种类型
1.常用的系统变量有:
$HOME , $PWD , $SHELL , $USER
$HOME :当前家目录路径
$PWD: 当前路径
$SHELL: 默认Shell解析器路径
$USER: 当前用户
2.自定义变量
1.基本语法
(1).定义变量: 变量=值 引用变量 $变量名 或者 ${ 变量名}(2).撤销变量:unset 变量
(3).声明静态变量:readonly 变量=值 (注意:不能unset)
(4).可把环境变量提升为全局环境变量,可供其他shell程序使用
语法: export 变量名
2.变量定义规则(1)变量名称可以由字母,数字和下划线组成,但不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
(4)变量值如果有空格,需要使用双引号或单引号括起来
一些特殊的符号变量
$n
(功能描述: n为数字,$0代表该脚本名称,$1~$9代表第一个到第九个参数,十以上的 参数需要用大括号包含,如 ${10})
$#
功能描述:获取所欲输入参数个数,常用于循环。
$*
功能描述:这个参数代表命令行中的所有参数, $* 把所有的参数看成一个整体
$@
功能描述:这个参数也代表命令行中的所有的参数,不过 $@把每个参数区分对待
变量的运算符
1. $[运算式] 或者 $( (运算狮) )
lt
变量内容的删除与替换
符号# 从前向后删除
#为最短匹配
##为贪婪匹配
%为从后向前删除
索引与切片
替换
/ /为贪婪匹配
${变量名-新的变量值}
变量没有被赋值(包括空值):都会使用“新的变量名”替代
变量有被赋值:不会被替代
[ 条件 ] ( 条件 前后都要加空格)
注意: 条件非空即为true ,[ ]返回false。
常用判断条件:
两个整数之间
-lt 小于 (less than)
-le 小于等于 (less equal)
-eq 等于 (equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(not equal)
文件权限测试
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
按文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并且是一个目录文件(directory)
字符串比较
提示 使用双引号
[ "$变量" = "字符串"] 是否相等
[ "$变量" = "字符串"] 是否相等
[ -z "字符串"] 长度是否是零
[ -n "字符串"] 长度是否不是零 变量为空或者未定义都为0
条件比较
[ "条件" -a "条件"] 是否都真
[ "条件" -o "条件"] 是否一个是真
模式匹配 case
1.基本语法
case $变量名 in
;;
“值1”)
如果变量的值等于1,则执行程序1
;;
“值2”)
如果变量的值等于2,则执行程序2
…省略其他分支…
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
2.实例(需求输入1 打印a,输入2打印b,都不符合输出c)
内容:#!/bin/bash
case $1 in
1)
echo "a"
;;
2)
echo "b"
;;
*)
echo "c"
;;
esac
基本语法:
if [ 条件判断式 ];then
程序或者
if [ 条件判断式 ]
then
程序elif相当于 ( else if )
[[ ]] 两个括号代表支持正则表达式
注意:
(1).方括号前后都要有空格
(2).if后面要有空格
1.基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
实现一个计算1+到100脚本
1 #!/bin/bash
2 # add
3
4 s=0;
5 for ((i=1 ;i<=100;i++))
6 do
7 s=$[i+s]
8 done
9 echo $s
for基本语法2
for 变量 in 值1 值2 值3
do
程序
done
#!/bin/bash
for i in $*
do
echo "I am $i"
done
基本语法: while[ 条件判断式 ]
do
程序
done
从1加到100
#!/bin/bash
s=0;
i=1;
while [ $i -le 100 ]
do
s=$[ $s + $i ];
i=$[ $i +1 ]
done
echo $s
read读取控制台输入
1.read基本语法
-p 指定读取值的提示符
-t 指定读取值等待时间
指定在三秒内输入
read -t 3 -p"3s" i
s=0;
while [ $i -le 100 ]
do
s=$[ $s + $i ];
i=$[ $i +1 ]
done
echo $s
basename会删除前缀
dirname与之相反
shell(工具)
1.cut
在文件中每一行剪切字节字符字段将这些输出
用法 cut [参数] filename
默认参数是指标副
不会改变原文件
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分割符,按照指定分隔符分割列 |
文本
1 2 3 4
5 6 7 8
9 10 11 12
切割第一二列
sed
是一个流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间“,接着用sed命令处理缓冲区中的内容,处理完后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾 不会改变原文件
命令 | 功能描述 |
---|---|
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除 |
s | 查找并替换 |
将包含5的行删除
将wo替换成ni
awk
一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分在进行分析处理
2.选项参数说明
选项参数 | 功能 |
---|---|
-F | 指定输入文件拆分符 |
-v | 赋值一个用户定义变量 |
使用用法类似于cut