暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Shell脚本进阶:点号(.)、source命令与here documents的实战应用

Linux技术宅 2024-06-03
903

点击👆Linux技术宅,关注我!!!



介绍

    在Shell脚本编写中,点号(.)和source命令以及here documents都是高级功能,它们能够显著提升脚本的灵活性和可读性。



(.)与 source

1、定义
    • 点号(.:在Shell脚本中,点号(.)是一个特殊的命令,用于在当前shell环境中读取并执行另一个脚本文件。也就是说,当使用点号来执行一个脚本时,该脚本中的变量、函数等定义会直接影响当前shell环境。
    • source命令source命令与点号的功能完全相同。它也是用来在当前shell环境中读取并执行另一个脚本文件的。这两个命令实际上是等价的,只是source命令更明确地表达了其用途。
2、功能
    • 在当前shell环境中执行:使用点号或source命令执行脚本时,脚本会在当前shell环境中运行,而不是在一个子shell中。这意味着脚本中定义的变量、函数等会在当前shell环境中保持其值,并且可以被后续执行的命令所访问。
    • 环境变量传递:由于点号和source命令在当前shell环境中执行脚本,因此脚本中定义的环境变量也会自动地传递到当前shell环境中。这对于需要在多个脚本之间共享环境变量的情况非常有用。
3、使用方法
    • 点号(.:在要执行的脚本文件名前加上点号和空格,然后跟上脚本文件的路径。
    . ./script.sh
      • source命令:使用source命令时,需要指定要执行的脚本文件作为参数。
      source ./script.sh
      4、示例
          创建两个脚本文件,script1.shscript2.sh。在script1.sh中,定义一个变量MY_VAR,并在script2.sh中访问它。
        • script1.sh:
        #!/bin/bash
        MY_VAR="Hello from script1!"
          • script2.sh:
          #!/bin/bash  
          . ./script1.sh # 或者 source ./script1.sh
          echo "The value of MY_VAR is: $MY_VAR"
          运行script2.sh时,首先使用点号或source命令执行script1.sh,然后在当前shell环境中定义MY_VAR变量。接着,script2.sh中的echo命令会输出MY_VAR的值。

          5、注意事项
            • 确保要执行的脚本文件具有可执行权限(虽然对于点号和source命令来说不是必需的,但通常是个好习惯)。
            • 如果脚本文件中有语法错误或运行时错误,这些错误将在当前shell环境中被捕获并显示。
            • 使用点号或source命令时要小心,因为脚本中的任何修改(如设置环境变量或定义函数)都会影响到当前shell环境。这可能会导致意外的副作用,特别是在复杂的脚本或交互式shell会话中。



          here documents

          1、定义
              在 shell 脚本中,here documents(也简称为 heredocs)是一种特殊的重定向方式,允许将一个多行的字符串传递给一个命令或程序,就好像从一个文件中读取这些行一样。但是,这些行实际上是在脚本中直接定义的,而不是在一个单独的文件中。
          2、功能
            • 简化脚本here documents 允许脚本在内部直接生成和传递文本,而无需创建和使用临时文件,从而简化了脚本的编写。
            • 减少中间文件:由于 here documents 直接在脚本内部生成文本,因此减少了脚本对中间文件的需求,提高了脚本的整洁度和可读性。
            • 标准输入替代品here documents 可以作为标准输入的一种替代品,为交互式程序或命令提供输入。
          3、基本语法
            command <<delimiter  
            document
            delimiter

            其中,command是接受输入的命令或程序,delimiter是一个用于标识here documents 开始和结束的标记符,可以是任意字符串,但通常选择不容易与文档内容混淆的字符串,如EOF(End Of File)。document是传递给命令或程序的多行文本。

            4、示例
              • 使用cat命令显示文本:
              cat <<EOF  
              This is a test.
              This is only a test.
              EOF
                • 使用wc -l命令统计行数:
                wc -l <<EOF  
                line 1
                line 2
                line 3
                EOF
                  • 无交互地设置用户密码(注意:直接在脚本中设置密码可能存在安全风险):
                  echo "newpassword\nnewpassword" | passwd username  
                  # 或者使用Here Documents
                  passwd username <<EOF
                  newpassword
                  newpassword
                  EOF
                  5、注意事项
                    • 标记符的选择:确保标记符(delimiter)在文档内容中不会出现,以避免混淆。
                    • 标记符的书写:标记符必须单独成行,且开头和结尾的标记符必须完全一致(包括大小写和空格)。
                    • 扩展和转义:如果 here documents 的内容需要进行参数扩展、命令替换或表达式计算,则不要将标记符用引号括起来或用转义符 \ 转义。否则,here documents 中的文本将不会被扩展。
                    • 缩进和空格:如果使用<<-而不是<<,则 here documents 中的行首的制表符(tab)将被忽略(但空格不会被忽略)。这允许在源代码中更优雅地对齐 here documents
                    • 安全性:在某些情况下,如设置用户密码,直接在脚本中使用 here documents 可能存在安全风险。请确保在适当的情况下使用它,并考虑其他安全措施。


                  推荐阅读

                  学习Nginx(十一):反向代理与Tomcat动静分离配置

                  05-21

                  学习Nginx(七):Location的URI解析

                  05-15


                  分享、在看与点赞

                  👇只要你点,我们就是胖友👇

                  文章转载自Linux技术宅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论