使用同一目录中的一个文件中定义的变量值

使用同一目录中的一个文件中定义的变量值

这个 GitHub 存储库我有一个名为 的目录nwsm。此目录包含nwsm.sh包含主脚本(运行其他脚本的脚本)的文件。

该目录还包含一些其他文件,其中包含主脚本每次执行一个的子脚本。

nwsm.sh我声明了一些变量,这些变量最终应该在所有上述下标中使用。和 下标中的变量扩展nwsm.sh应该以相同的方式进行,只是在它们的执行中。


请注意,该目录除了及其子脚本文件之外不包含任何其他文件nwsm.sh,也不应在将来的任何时候包含其他文件。

开始运行nwsm.sh后,下标内的变量扩展应使用 , 中定义的相关值进行。nwsm.sh

这是主脚本nwsm.sh(首先是实用程序的变量声明read,然后是相邻文件的执行):

#!/bin/bash
domain="$1" && test -z "$domain" && exit 2

read -sp "Please enter DB root password:      " dbrootp_1 && echo
read -sp "Please enter DB root password again:" dbrootp_2 && echo
if [ "$dbrootp_1" != "$dbrootp_2" ]; then echo "Values unmatched" && exit 1 fi

read -sp "Please enter DB user password:      " dbuserp_1 && echo
read -sp "Please enter DB user password again:" dbuserp_2 && echo
if [ "$dbuserp_1" != "$dbuserp_2" ]; then echo "Values unmatched" && exit 1 fi

"$PWD"/tests.sh
"$PWD"/wp-cli.sh
"$PWD"/nginx.sh
"$PWD"/dbstack.sh
"$PWD"/certbot.sh

我如何确保 中定义的值在和它们运行nwsm.sh时可供其所有对应项使用?.nwsm

答案1

如果您的意思只是想让变量在主脚本运行其他脚本时可见,那么您只需使用export它们:

$猫主.sh
#!/bin/sh
读富
导出富
./foo.sh
$ 猫 foo.sh
#!/bin/sh
echo "foo 是 $foo"

$ ./main.sh
废话
foo 是废话
$

其他脚本作为主脚本的子进程运行,exported 变量通过环境传递给它们。这些都不会将变量限制为特定目录中的脚本,导出的变量对于主脚本启动的所有程序都是可见的。如果您想运行某些程序而不将变量传递给它们,则必须export -n首先取消导出它们。您还可以在其他脚本开始时取消导出,以避免它们传递变量。

另请注意,无需在主脚本(或其他脚本)末尾清除变量或取消导出它们。变量只存在于正在运行的shell进程的内存中,当进程结束时,变量消失。

(另一方面,将变量传递给独立进程需要将它们保存到文件或类似文件中。)


当然,实现几乎相同类型的模块化的另一种方法是将程序拆分为函数,将它们存储在单独的文件中,并将source这些文件与主脚本分开。这样,程序中的所有变量对所有函数都是可见的。 (这可能是更可取的,也可能不是更可取的。)

答案2

如果导出变量,则在主脚本末尾“取消设置”变量。

unset domain
unset dbrootp_1
unset dbrootp_2
unset dbuserp_1
unset dbuserp_2

unset: unset [-f] [-v] [name ...] 对于每个 NAME,删除相应的变量或函数。给定-v', unset will only act on variables. Given the-f' 标志,取消设置将仅作用于函数。如果没有任何标志,则 unset 首先尝试取消设置变量,如果失败,则尝试取消设置函数。有些变量无法取消设置;另请参阅只读。

相关内容