(1)shell脚本:一个可执行并实现某种预设功能的文本文件;
(2)作用:命令集合起来,批量地去执行
(3)脚本的规范:
①脚本文件命名:自定义名称.sh(shell脚本)
②脚本的三要素:
第一,声明环境:#!/bin/bash
第二,必要的注释:作者信息(姓名,练习方式),代码结构与重要代码的解释
第三,可执行代码(命令+逻辑结构)
③测试脚本
办法1:chmod +x /路径/脚本.sh
/路径/脚本.sh(./脚本.sh)
作用: 作用:打开一个子shell来读取并执行FileName中命令。
注:运行一个shell脚本时会启动另一个命令解释器.
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.
这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.
办法2:
1)source 脚本.sh
作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
注:该命令通常用命令“.”来替代。 如:source .bash_profile . .bash_profile两者等效。
source(或点)命令通常用于重新执行刚修改的初始化文档。
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是个点符号,(从Bourne Shell而来)。
2)sh 脚本.sh ##可用 2>>叫错误的信息写入到一个文件中
bash 脚本.sh
作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
注:两者在执行文件时的不同,是分别用自己的shell来跑文件。
sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,"
shell脚本编码常用工具
(1)管道符:将管道前面执行的结果交由后面的命令进行二次处理
(2)输出重定向(>覆盖 >>追加)
>:只收集正确输出
2>:只收集错误输出
&:收集正确输出与错误输出
黑洞设备:/dev/null ##粉粹输出结果
>&2:把echo出来的信息重定向为一个报错信息(在执行脚本的时候,可以通过2>/dev/null,将重定向到报错信息中)
(3)echo “内容”:将结果输出到屏幕上
echo “内容“ >> 文件 :将内容写入到文件中
linux三剑客:
(一)sed
sed:是一种非交互式的编辑器
选项:
-i:直接修改文件内容
格式:
i:插入 例如:sed -i "3i huangxiaoliang" file
d:删除指定行 例如:sed -i "1d" file
a:新增 例如:sed -i "5a abc" file
s:搜索替换 格式:sed -i 's/被替换的内容/替换后的内容/g' 文件
拓展:vim编辑器
vim:文本编辑器
三种基本模式:命令行模式、编辑模式、末行模式
命令行模式的快捷键:
ctl+b/ctl+f:上下翻页
gg/G:跳到首/尾行
(二)zgrep/grep
grep:查找文件内容
格式:grep 内容 文件名
选项:
-i:忽略大小写
-v: 反选
-e:多选项查找
-E: 使用扩展正则表达式,而不是基本正则表达式,在使用-E选项时,相当于使用egrep
满足其中之一即匹配
# grep -E ‘word1|word2|word3’ file.txt
与:都满足才匹配
# grep word1 file.txt | grep word2 | grep word3
根据内容来查找文件:
-r:递归显示目录下所有符合内容的文件
-o:只显示匹配的部分,而不是字符所在的一整行
-n(number):显示(结果所在的)行数
-C:查找匹配行前后行的内容
zgrep
zgrep: 查看压缩文件的内容
# zgrep --binary-files=text '匹配的字串' *.tar.gz
(三)awk
awk: 行处理器,依次对文件的每一行进行处理
选项:
-F:指定分隔符
格式:awk -F分隔符 ‘{print $n}’ 文件名
awk除了对文件的操作之外,还可以通过管道对输出结果进行处理:
从a,b,c,d中输出c,指定逗号为分隔符
echo "a,b,c,d" | awk -F, '{print $3}'
关键字:
BEGIN:提供运行脚本前的一些操作
END:提供运行后的一些操作
以不变的名称存放可以变化的值:
(1)shell脚本总定义变量并赋值:变量名=变量值
1)变量的命名规范:只能由字母,数字,下划线组成;严格区分大小写,不能以数字开头
2)=是一个赋值号
3)赋予的可以是字符串,有空格的需要用‘’括起来
将命令的输出结果作为参数:$(命令)或‘命令’ ##例如:a=$(find /home/ -user student -type f) 这种不推荐使用 ;a=’ find /home/ -user student -type f’
整数运算$[+-*/%] :运算的对象只能是整数;运算的结果/向下取整,%取余数 ##这种只有运算的时候才会用到,不怎么用到,仅做了解
(2)shell脚本引用变量:$变量名或者${变量名} ##${变量名}可以与其他内容组合,比如$LANG想要与2结合,可以${LANG}2
1)查看变量值:echo $变量名或者${变量名}
变量的种类
(1)自定义变量:用户自主设置,修改及使用
1)直接在脚本中定义
2)read -p ‘提示信息’ 变量名: 以交互式的形式从键盘获取变量的值存储到变量名
(2)环境变量:由系统定义并赋值,用户可以直接调用
常见的环境变量:$USER,$LANG,$PAHT,$HOME
1)$USER:表示的是当前用户名
2)$LANG:系统语言
3)$HOME:表示当前用户的家目录
4)$PATH: 代表执行命令的搜索路径
(3)位置变量:由系统定义并赋值,用户直接调用即可
作用:执行脚本时,可以用来作为参数
表示${n} (n为序号),代表执行脚本时的第n个参数
示例:$1,$2,$3…..${10},${11}
(4)预定义变量:由系统定义并赋值,用户直接调用即可
1) $#:(已加载的)位置变量的个数,求和
2)$*:所有位置变量的值
3)$?:程序或脚本退出后的状态值,默认为0,代
(一)判断结构
条件测试:[条件测试表达式]
(1)括号的每个部分都需要有空格隔开
(2)
1)检查及判断文件状态
-e:文档存在为真
-d:是目录且存在为真
-f:是文件且且存在为真
-r:存在文档且有读权限为真
-w:存在文档且读权限为真
-x:存在文档且有执行权限为真
2)比较大小,不可以比较分数(小数)否则报错
-eq 等于
-en 不等于
-gt 大于
-ge 大于或等于
-lt 小于
-le 小于或等于
备:每个单词的首字母
e或eq:equal 等于
n:no 不
t:than 比…
g:great 大
l:less 小
3)字符串对比
==:字符串相同为真
!=: 字符串相同
4)在条件表达式加!代表取反
例如:[ ! haha == xixi ]
选择判断
(1)没有结构的选择判断:
1)&&:如果&&前面的判断成立或命令执行成功,则执行&&后面的命令
2)||:仅当||前面的判断不成立或命令执行失败,才执行||后面的命令
(2)逻辑结构:if判断
1)if双分支处理
if [条件测试表达式];then
命令序列1
else
命令序列2
fi
2)if多分支处理
if [条件测试表达式];then
命令序列1
elif [条件测试表达式];then
命令序列2
else
命令序列2
fi
备:退出脚本,一般是通过条件判断不符合条件报错后退出 ##特殊用法:exit值,可以定义$?的返回值
(3)循环结构
第一种结构:
for 变量名 in 值列表
do
命令序列
done
1)作用:
for循环的运作方式,是将串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
2)原理图:
第二种结构:
行1: while 条件测试
行2: do
行3: 执行命令
行4: done
说明:
行1,首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则不进入循环,介绍while 命令
行3,执行命令区域,这些命令中,应该要有改变条件测试的命令,这样,才有机会在有限步骤后结束执行while循环(除非想要执行无穷循环)。
行4,回到行1,执行while命令
第三种结构:
until循环的语法:
行1,如果条件测试结果为假(传回值不为0),就进入循环。
行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。
行4,回到行1,执行until命令。
(1)作用:while循环的条件测试是测真值,until循环则是测假值。
(2)原理流程图: