有两个 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
如果您可以重写脚本以使用参数而不是脚本修改 - 就这样做。
当您想要修改脚本时,有一些合法或半合法的情况:
- 脚本可能有太多参数,不方便在命令行中传递。在这种情况下,做类似的事情会更容易
sed -i "s/@PARAM1@/a/" main.sh
sed -i "s/@PARAM2@/b/" main.sh
...
sed -i "s/@PARAM99999@/zzzzzzzz/" main.sh
但在这种情况下,最好将这些参数放入配置文件中并从脚本中读取它
- 该脚本可以是一大套脚本的一部分。可以
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
。在初始设置默认值后,您将使用参数。
- 有问题的脚本可能不是 shell 脚本,并且根本无法读取参数。这种情况通常发生在脚本本身被输入到某些工具中(例如
sqlplus
或) - “正在更改脚本”expect
的唯一真正合法的情况sed
答案2
如果您不需要显式参数,则可能需要寻找环境变量。如果存在您可以使用的一个,它就在 的输出中env
。否则,您可能会要求您的用户设置一个新的。
主脚本需要人员的姓名,以便将文件保存到他们的目录中。
听起来像$HOME
或 变量之一$XDG_*
:
https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html