目录
1. shell内置变量
1.1 和脚本文件有关
符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
1.2 字符串精确截取
格式:${变量名:起始位置:截取长度}
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
1.3 默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}
场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
2. 表达式
2.1 测试语句
测试语句形式
A: test 条件表达式
B: [ 条件表达式 ]
格式注意:
以上两种方法的作用完全一样,后者为常用。
但后者需要注意方括号[、]与条件表达式之间至少有一个空格。
test跟 [] 的意思一样
条件成立,状态返回值是0
条件不成立,状态返回值是1
操作注意:
[]两侧为什么要有空格
root@ubuntu:~# [-x /bin/bash ]
[-x: command not found
可以看到:两侧没有空格,就会报错,为什么呢?因为你不合规范
2.2 条件表达式
逻辑表达式
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有: && 和 ||
&&
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:
# [ 1 = 1 ] && echo "条件成立"
条件成立
# [ 1 = 2 ] && echo "条件成立"
#
||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 -- 对着干
如果命令1执行失败,那么命令2执行
示例:
# [ 1 = 2 ] || echo "条件不成立"
条件不成立
# [ 1 = 1 ] || echo "条件不成立"
#
文件表达式
-f 判断输入内容是否是一个文件
示例:
# [ -f weizhi.sh ] && echo "是一个文件"
是一个文件
# [ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件
-d 判断输入内容是否是一个目录
-x 判断输入内容是否可执行
数值操作符
主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
n1 -eq n2 相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于
字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
判断字符是否内容一致
root@ubuntu:~# [ a == a ]
root@ubuntu:~# echo $?
0
root@ubuntu:~# [ a != a ]
root@ubuntu:~# echo $?
1
2.3 计算表达式
定义:
计算表达式,简单来说就是对具体的内容进行算数计算
格式:
方式一:
$(()) $(( 计算表达式 ))
方式二:
let let 计算表达式
注意:$(())中只能用+-*/和()运算符,并且只能做整数运算
3. linux常见符号
3.1 重定向符号
在shell脚本中有两种常见的重定向符号 > 和 >>
> 符号
作用:
> 表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
>> 符号
作用:
>> 表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
3.2 管道符 |
| 这个就是管道符,传递信息使用的
使用格式:
命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用
命令演示:
查看当前系统中的全局变量SHELL
admin-1@ubuntu:~$ env | grep SHELL
SHELL=/bin/bash
3.3 其他符号
后台展示符号 &
定义:& 就是将一个命令从前台转到后台执行
使用格式:命令 &
全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
综合演练示例
脚本内容
#!/bin/bash
echo '下一条错误命令'
dsfsafsafdsa
脚本执行效果
admin-1@ubuntu:~# bash ceshi.sh
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
1 和 2 综合演练
admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
admin-1@ubuntu:~# cat ceshi-ok
下一条错误命令
admin-1@ubuntu:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found
全部信息演练
admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1
admin-1@ubuntu:~# cat ceshi-all
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
linux系统垃圾桶
/dev/null 是linux下的一个设备文件,
这个文件类似于一个垃圾桶,特点是:容量无限
4. 常见命令详解
4.1 grep命令详解
grep命令是我们常用的一个强大的文本搜索命令。
命令格式详解
grep [参数] [关键字] <文件名>
注意:
我们在查看某个文件的内容的时候,是需要有<文件名>
grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的
可以通过 grep --help 查看grep的帮助信息
参数详解
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -v 或 --invert-match : 显示不包含匹配文本的所有行。
4.2 sed命令详解
sed 行文件编辑工具。因为它编辑文件是以行为单位的。
命令格式详解
命令格式:
sed [参数] '<匹配条件> [动作]' [文件名]
注意:可以通过 sed --help 查看grep的帮助信息
参数详解:
参数为空 表示sed的操作效果,实际上不对文件进行编辑
-i 表示对文件进行编辑
注意:mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i ''
匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:
'/关键字/'
注意:隔离符号 / 可以更换成 @、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。
动作详解
- -a 在匹配到的内容下一行增加内容
- -i 在匹配到的内容上一行增加内容
- -d 删除匹配到的内容
- -s 替换匹配到的内容
注意:上面的动作应该在参数为-i的时候使用,不然的话不会有效果
替换命令演示
关于替换,我们从三个方面来学习:
行号、列号、全体
命令格式:
sed -i [替换格式] [文件名]
注意:替换命令的写法:'s###' ---> 's#原内容##' ---> 's#原内容#替换后内容#'
常见替换格式:
模板文件内容
admin-1@ubuntu:~$ cat sed.txt
nihao sed sed sed
nihao sed sed sed
nihao sed sed sed
替换每行首个匹配内容:
sed -i 's#原内容#替换后内容#' 文件名
示例:替换首每行的第1个sed为SED
admin-1@ubuntu:~$ sed -i 's#sed#SED#' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed
替换全部匹配内容:
sed -i 's#原内容#替换后内容#g' 文件名
示例:替换全部sed为des
admin-1@ubuntu:~$ sed -i 's#sed#SED#g' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao SED SED SED
nihao SED SED SED
指定行号替换首个匹配内容:
sed -i '行号s#原内容#替换后内容#' 文件名
示例:替换第2行的首个SED为sed
admin-1@ubuntu:~$ sed -i '2s#SED#sed#' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED
首行指定列号替换匹配内容:
sed -i 's#原内容#替换后内容#列号' 文件名
示例:替换每行的第2个SED为sed
admin-1@ubuntu:~$ sed -i 's#SED#sed#2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED
指定行号列号匹配内容:
sed -i '行号s#原内容#替换后内容#列号' 文件名
示例:替换第3行的第2个SED为sed
admin-1@ubuntu:~$ sed -i '3s#SED#sed#2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed sed
增加操作
作用:在指定行号的下一行增加内容
格式:sed -i '行号a\增加的内容' 文件名
注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i '1,3a\增加内容' 文件名
演示效果:
指定行号增加内容
admin-1@ubuntu:~$ sed -i '2a\zengjia-2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
zengjia-2
nihao SED sed sed
指定1~3每行都增加内容
admin-1@ubuntu:~$ sed -i '1,3a\tongshi-2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
作用:在指定行号的当行增加内容
格式:sed -i '行号i\增加的内容' 文件名
注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i '1,3a\增加内容' 文件名
演示效果:
指定行号增加内容
admin-1@ubuntu:~$ sed -i '1i\insert-1' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
删除操作
作用:指定行号删除
格式:sed -i '行号d' 文件名
注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如
sed -i '1,3d' 文件名
删除演练
删除第4行内容
admin-1@ubuntu:~$ sed -i '4d' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
删除多行(3-5行)内容
admin-1@ubuntu:~$ sed -i '3,5d' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed
4.3 awk命令详解
awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件。
命令格式:
awk [参数] '[ 动作]' [文件名]
常见参数:
-F 指定行的分隔符
常见动作:
print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开
常见内置变量
FILENAME 当前输入文件的文件名,该变量是只读的
NR 指定显示行的行号
NF 输出 最后一列的内容
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab
命令演示
模板文件内容
admin-1@ubuntu:~$ cat awk.txt
nihao awk awk awk
nihao awk awk awk
打印指定列内容
打印第1列的内容
admin-1@ubuntu:~$ awk '{print $1}' awk.txt
nihao
nihao
指定行打印内容
打印第一行第1和第3列内容
admin-1@ubuntu:~$ awk 'NR==1 {print $1,$3}' awk.txt
nihao awk
指定隔离分隔符,查看内容
admin-1@ubuntu:~$ cat linshi.txt
root:x:0:0:root:/root:/bin/bash
admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' linshi.txt
root /bin/bash
设置显示分隔符,显示内容
admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
1:nihao awk awk awk
2:nihao awk awk awk
4.4 find命令详解
命令格式:
find [路径] [参数] [关键字]
参数详解
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-type 查找某一类型的文件,
诸如:
b - 块设备文件 d - 目录 c - 字符设备文件
p - 管道文件 l - 符号链接文件 f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-mindepth n:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。
! : 表示取反
5 简单流程控制语句
5.1 单分支if语句
语法格式
if [ 条件 ]
then
指令
fi
场景:单一条件,只有一个输出
单分支if语句示例
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
fi
5.2 双分支if语句
语法格式
if [ 条件 ]
then
指令1
else
指令2
fi
场景: 一个条件,两种结果
双分支if语句示例
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
else
echo "您的性别是 女"
fi
5.3 多分支if语句
语法格式
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
场景:n个条件,n+1个结果
5.4 case选择语句
我们发现多if语句使用的时候,代码量很多,而且整体看起来确实有那么一丁点乱,有没有办法更好的实现这种效果呢?就是Case语句。
case 语句格式
case 变量名 in
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
esac
注意:首行关键字是case,末行关键字esac,选择项后面都有 ),每个选择的执行语句结尾都有两个分号;
5.5 for循环语句
循环指定的所有元素,循环完毕之后就推出
语法格式
语法格式
for 值 in 列表
do
执行语句
done
场景:遍历列表
注意:”for” 循环总是接收 “in” 语句之后的某种类型的字列表
执行次数和list列表中常数或字符串的个数相同,当循环的数量足够了,就自动退出
示例:遍历文件
#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
5.6 while循环语句
语法格式
while 条件
do
执行语句
done
注意:条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))
场景:只要条件满足,就一直循环下去
while语句示例
脚本内容
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
5.7 until循环语句
语法格式
until 条件
do
执行语句
done
注意:条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))
场景:只要条件不满足,就一直循环下去
6. 复杂流程控制语句
6.1 函数基础知识
函数是什么?
函数就是将某些命令组合起来实现某一特殊功能的方式,是脚本编写中非常重要的一部分。
简单函数格式:
定义函数:
函数名(){
函数体
}
调用函数:
函数名
传参函数格式:
传参数
函数名 参数
函数体调用参数:
函数名(){
函数体 $n
}
注意:类似于shell内置变量中的位置参数
6.2 函数实践
简单函数定义和调用示例
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
echo "wo de mingzi shi 111"
}
dayin
函数传参和函数体内调用参数示例
#!/bin/bash
# 函数的使用场景二
dayin(){
echo "wo de mingzi shi $1"
}
dayin 111
函数调用脚本传参
#!/bin/bash
# 函数传参演示
# 定义传参数函数
dayin(){
echo "wode mignzi shi $1"
}
# 函数传参
dayin $1
脚本传多参,函数分别调用示例
#!/bin/bash
# 函数的使用场景二
dayin(){
echo "wo de mingzi shi $1"
echo "wo de mingzi shi $2"
echo "wo de mingzi shi $3"
}