shell脚本进阶-EOF
EOF 多行重定向
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令进行行内容的追加了。EOF一般会配合cat能够多行文本输出.
cat 本质上是对于输入的内容进行打印,支持标准输入,所以后面可以跟文件,把文件的内容进行打印,直接cat是针对于一行的操作,如 cat >>cattest.txt 向文件中追加内容,是一行一行的追加,输入一行回车后,就会把一行的内容写入到文件中,实时生效的。而如果使用了EOF多行重定向技术,则不是一行一行的生效,而是一次性的输出了多行或向文件中添加了多行。这种可以用于脚本中,通过脚本去修改一个文件多行内容。
cat << EOF //输出多行
cat >> cattest.txt << EOF //或者cat << EOF >> cattest.txt //向文件中添加多行
cat > cattest.txt << EOF //或者cat << EOF > cattest.txt //向文件中添加多行覆盖
for循环
在脚本中 两种写法,不同的习惯而已
循环1到100内的奇数之和
函数
declare -f 查看当前所有函数,包括系统的函数
declare -F 只看函数名字
函数定义只针对于当前窗口有效,退出就没有了
unset funcname 删除方法
脚本 func_test
定义了一个函数,用的时候 就和命令一样直接写函数名称,不带()
函数定义与调用函数 相分离,就是专门定义一些函数,然后每个脚本都可以调用
一个文件专门定义函数 ,这个functions文件 全部定义了函数,
脚本里面调用函数 通过sources 引入函数文件
函数也可以使用参数
信号捕捉
- trap '触发指令' 信号 进程收到系统发出的指定信号后,将执行自定义指令,而不会执行原操作
- trap '' 信号 忽略信号的操作
- trap '-' 信号 恢复原信号的操作
- trap -p 列出自定义信号操作
- trap finish EXIT 当脚本退出时,执行finish函数
- trap finish EXIT 脚本退出时,运行的函数,无论什么样的退出,错误的还是正常退出都会发生的。
数组
数组:存储多个元素的连续的内存空间,相当于多个变量的集
数值数组,不用声明,可以直接用,而自定义数组需要先声明
增加一个新的元素,在最后面, 因为是从0开始的,所以最后一位就是数组的个数
数组 一次赋多个值,可以看出本质上就是 空格隔开,这种结构可以有很多种方式实现
稀疏数组,不连续
交互式的赋值
自定义下标,就是关联数组,必须先声明,后使用,上面的都是不用声明直接使用的
字符串截取
declare [选项] 变量名
- -r 声明或显示只读变量
- -i 将变量定义为整型数
- -a 将变量定义为数组
- -A 将变量定义为关联数组
- -f 显示已定义的所有函数名及其内容
- -F 仅显示已定义的所有函数名
- -x 声明或显示环境变量和函数
- -l 声明变量为小写字母 declare –l var=UPPER
- -u 声明变量为大写字母 declare –u var=lower
eval命令
该命令对变量进行两次扫描
[root@server ~]# CMD=whoami
[root@server ~]# echo $CMD
whoami
[root@server ~]# eval $CMD
root
[root@server ~]# n=10
[root@server ~]# echo {0..$n}
{0..10}
[root@server ~]# eval echo {0..$n}
0 1 2 3 4 5 6 7 8 9 10
mktemp 创建临时文件
mktemp fileXXXX
-d: 创建临时目录
-p DIR或--tmpdir=DIR:指明临时文件所存放目录位置
install 复制命令 顺便可以设置权限
expect
有时候我们执行命令,会交互式的问你,等待用户去输入东西,那如果是写在脚本中,也会提示让你输入的,但是我们写在脚本中,就是为了自动化的,所以可以使用expect工具,当出现某一些字符的时候,可以自动输入一些字符。
比如我们可以自动化的传一个文件,到很多台服务器上,以前的方式就是我们手动一个一个传,那多累,有脚本瞬间可以完成一百台服务器的文件拷贝工作。就是通过expect完成。