在平时的运维工作中,今天写一篇shell脚本入门,我们经常会碰到这样一个场景:
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令行进行内容的追加了。
小编现在就是当运维的,你有什么不懂欢迎留言。
下面就对EOF的用法进行梳理:
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF一般会配合cat能够多行文本输出.
其用法如下:
<
…
EOF //结束
还可以自定义,比如自定义:
<
…
BBB //结束
1、shell简介
shell脚本入门
什么是shell
shell是一个命令解释器,是一个程序/bin/bash,解释linux的命令
shell交互式命令使用
打开终端,一行行敲命令
shell脚本
一系列的命令组成的文件,结合shell语法
shell脚本注释
1、单行注释 #
2、多行注释
:<< 字符 。。。。。。
字符
:<< b 。。。。。。
。。。。。。
b
2、脚本执行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号)
3、变量
本地变量
方式一: name=wang
变量名=变量值
重点:
变量值必须是一个整体,中间没有特殊字符
方式二:name=‘wang’
变量名=‘变量值’
重点:
我看到的内容,我就输出什么内容
方式三:name=“wang”
变量名=“变量值”
区别:
myname=‘is $name’ 不会解析变量
myname=“is $name” 会解析变量
(重点)shell执行环境
开一个终端是一个shell环境
bash运行一个shell脚本,会在新的shell环境执行
source 执行脚本时,不会新开shell环境
能与当前终端共享shell环境
(重点)命令变量
1、 name=ls
2、 name=$(pwd)
注意:把命令执行的结果赋值给变量
全局变量
1、name=wang
export name
2、export name=wang
如果想让变量在任何终端都能使用,修改文件
vi ~/.bashrc
追加export name=wang
source ~/.bashrc
重启操作系统
变量查看
“${变量名}”
场景:
标准使用方式
取消变量
unset 变量名
4、内置变量(重点)
$0 获取当前执行的shell脚本文件名
n 获 取 当 前 执 行 的 s h e l l 脚 本 的 第 n 个 参 数 值 , n = 1..9 , 当 n 为 0 时 表 示 脚 本 的 文 件 名 , 如 果 n 大 于 9 就 要 用 大 括 号 括 起 来 n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来 n获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来{10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
如果执行的是一个脚本
bash hh.sh
$?返回的是hh.sh中最后一条命令的结果
字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值
${name:-默认值}
name=’’
${name:-hh} 返回 hh
name=‘wang’
${name:-hh} 返回 wang
${name+默认值}
name=’’
${name+hh} 返回 hh
name=‘wang’
${name+hh} 返回 hh
5、测试语句(重点)
1、test 1 = 2
2、[ 1 = 2 ]
注意:=左右必须有空格,[]左右必须有空格
使用echo $? 返回0代表成功,1代表失败
6、条件表达式(重点)
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 – 夫唱妇随
如果命令1执行失败,那么命令2也不执行
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 – 对着干
如果命令1执行失败,那么命令2执行
[ -f hello.sh ] 判断是否是文件
[ -d hello.sh ] 判断是否是文件夹
[ -x hello.sh ] 判断是否可执行
[ -x hello.sh ] && [ -f hello.sh ] 判断是否是可执行文件
数值比较
n1 -eq n2 相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于
字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
数值计算
1、$((a+b))
2、let a=$a+1
7、符号
重定向
命令 > 文件
把命令执行的结果中正确的信息放到文件中
任何命令执行右两种结果,1代表正确,2代表错误
bash hh.sh >/dev/null 2>&1 &
前面&符号代表引用,后面&符号代表后台运行
linux 四剑客
grep 查找文件内容
grep -nr hello .
find 根据关键字查找文件
find . -name ‘*sh’
sed 行编辑工具,以行为单位
替换
sed -i “2s#查找的内容#替换的内容#1” sed.txt
查找第二行,只改找到的第一个值
sed -i “s#查找的内容#替换的内容#g” sed.txt
s前不指定行是处理所有行,列写g代表处理所有列
插入
sed -i “1i\hello” sed.txt
在第1行前插入一行
追加
sed -i “1,3a\hello” sed.txt
在第1,2,3行后面都添加一行
删除
sed -i “3d” sed.txt
删除第三行
awk 分析工具,按行处理
默认把数据按照空格或tab,拆分数据
awk ‘NR==1 {print $1,$2}’ awk.txt
NR==1 代表只处理第一行
awk -F ‘:’ ‘{print NF}’ awk2.txt
-F ‘:’ 代表把数据按照:拆分
awk ‘BEGIN{FS=":";OFS="—"} {print $1,$7}’ awk2.txt
FS代表输入的数据按照什么拆分,OFS代表输出的内容的分隔符