一个shell免交互,大大提高工作效率

shell编程之免交互



前言


1. Here Document免交互

1.1 Here Document概述

Here Document 使用 I/O 重定向的方式将命令列表提供给交互式程序,比如 ftp、cat 或 read 命令。

HereDocument 标准输入的一种替代品(可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入)。

语法格式:

命令 <<标记
...
...
标记

特殊字符 “<<” 在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作 “命令” 的标准输入。另外 Here Document 也可以与非交互式程序和命令一起使用。

四点注意事项:

  • 标记可以使用任意的合法字符(通常为EOF);
  • 结尾的标记一定要顶格写,前面不能有任何字符;
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头的标记前后的空格会被省略.
    请添加图片描述

补充:
免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间,直接将内容传给wc -l来统计

wc -l <<EOF
> abc
> 123
> aaa
> EOF
3

案例1:
输入保存到文件

[root@192 ~]# cat > name.txt <<EOF   //输入保存到文件
> zhangsan
> lisi
> EOF

请添加图片描述
追加输出保存到文件

[root@192 ~]# cat >> name <<EOF    //追加输入保存到文件
> wangwu
> EOF

请添加图片描述
案例2:创建 yum 源

[root@localhost ~]# cat > test.repo <<EOF
> [test]
> name=test
> baseurl=file:///mnt
> enabled=1
> gpgcheck=0
> EOF

另外写法1 cat <<EOF > local.repo
另外写法2 tee test1.txt <<EOF

1.2 Here Documen 免交互

  • 通过read命令接收输入并打印,输入值是两个 EOF 标记之间的部分,也就是“10”,这将作为变量 a 的值
[root@192 ~]# read a <<EOF
> 10
> EOF
[root@192 ~]# echo $a
10
  • read命令只接受单行输入,两行或多行显示不出来
[root@192 ~]# read i <<EOF
> hello
> word
> EOF
[root@192 ~]# echo $i
hello
[root@192 ~]# read j <<EOF
> hello word
> EOF
[root@192 ~]# echo $a
hello word
  • 通过 passwd 给用户设置密码

案例1:给用户创建密码

[root@192 ~]# passwd zhangsan <<EOF
> 123456
> 123456
> EOF
更改用户 zhangsan 的密码 。
新的 密码:无效的密码:密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

1.3 变量设定(支持变量替换)

在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入

案例1:测试EOF中变量被替换为实际值。
请添加图片描述
案例2:整体赋值变量输出(echo)
请添加图片描述

1.4 关闭变量替换

在上面的例子中使用单引号将开头的EOF括住
代表关闭变量的替换功能,按照字符原本的样子输出,不做任何修改或替换

#!/bin/bash

ivar="Welcome to shell."

#使用单引号将开头的EOF括住,代表关闭变量替换功能,下面引用时,会视为普通字符输出
myvar=$(cat <<'EOF'
This is Line 1.
That are Sun,Moon and stars.
$ivar
EOF
)

echo "$myvar"

请添加图片描述

1.5 去掉每行之前的 TAB 字符

在第一行的标记前面加‘-’,这个表示要抑制各行首 TAB 的作用。

[root@localhost ~]# vim tab.sh    //写一个脚本测试抑制tab键输出

#!/bin/bash
cat <<EOF
        hello world
EOF

cat <<-EOF
        hello world
EOF

[root@localhost ~]# bash tab.sh 
	hello world
hello world

1.6 多行注释

Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。Here Document 的引入解决了多行注释的问题。
“:” 代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。
请添加图片描述


总结

猜你喜欢

转载自blog.csdn.net/weixin_55609819/article/details/120331571