在这个 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 是废话 $
其他脚本作为主脚本的子进程运行,export
ed 变量通过环境传递给它们。这些都不会将变量限制为特定目录中的脚本,导出的变量对于主脚本启动的所有程序都是可见的。如果您想运行某些程序而不将变量传递给它们,则必须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 首先尝试取消设置变量,如果失败,则尝试取消设置函数。有些变量无法取消设置;另请参阅只读。