使用 sed 将变量传递给另一个脚本是不好的做法吗?

使用 sed 将变量传递给另一个脚本是不好的做法吗?

有两个 shell 脚本。

其中一个是源文件源码.sh。该源文件将供多个人使用,每个人都有自己的目录。

name = "foo"

主要脚本主目录运行大部分代码。我需要通过变量name

name = "foo"

sed -i "3i\\$name" /main.sh

/scripts/main.sh

sed -i '3d' /main.sh

这部分代码已经提前写好了。

删除 sed 并编写以下内容不是更好吗?

/scripts/main.sh "name"

这也是我在 Bash 中的第一个项目,所以我的专业知识有限。

答案1

如果您可以重写脚本以使用参数而不是脚本修改 - 就这样做。

当您想要修改脚本时,有一些合法或半合法的情况:

  1. 脚本可能有太多参数,不方便在命令行中传递。在这种情况下,做类似的事情会更容易
sed -i "s/@PARAM1@/a/" main.sh
sed -i "s/@PARAM2@/b/" main.sh
...
sed -i "s/@PARAM99999@/zzzzzzzz/" main.sh

但在这种情况下,最好将这些参数放入配置文件中并从脚本中读取它

  1. 该脚本可以是一大套脚本的一部分。可以sed在多个脚本上循环调用,这些脚本应共享相同的硬编码值。这种方法通常用于各种自动生成器和/或构建系统。

但在这种情况下,相关脚本通常以双重方式完成 - 它们以正常方式读取参数,但设置sed默认值。就像是:

#!/bin/bash
usage() {
  echo "-a=N do something (default value @A@)"
  echo "-b=ABC do something else (default value @B@)"
}

A=@A@
B=@B@
while getopts "a:b:" par; do
  case $par in
   a) A=$OPTARG
       ;;
   b) B=$OPTARG
       ;;
    *) usage
       ;;
  esac
done
echo $A
echo $B

如果复杂的应用程序中有多个这样的脚本,那么将所有这些脚本通过循环传递可能会非常方便sed -i "s/@A@/somevalue" $script。在初始设置默认值后,您将使用参数。

  1. 有问题的脚本可能不是 shell 脚本,并且根本无法读取参数。这种情况通常发生在脚本本身被输入到某些工具中(例如sqlplus或) - “正在更改脚本”expect的唯一真正合法的情况sed

答案2

如果您不需要显式参数,则可能需要寻找环境变量。如果存在您可以使用的一个,它就在 的输出中env。否则,您可能会要求您的用户设置一个新的。

主脚本需要人员的姓名,以便将文件保存到他们的目录中。

听起来像$HOME或 变量之一$XDG_*https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html

相关内容