我有一个三壳脚本。我必须使用用户输入的值计数从 script1.sh 到 script2.sh。如何使用用户输入的值计数从 script1.sh 到 script2.sh main.sh?
scrip1.sh
read -p 'Enter a number:' count
script2.sh
echo "Count:$count"
main.sh
sleep 1 && ./script1.sh
sleep 1 && ./script2.sh
如何修改子外壳中的全局变量?
这是你真正的问题。
简而言之,你不能!(见这里(
您希望变量$count
被main.sh
知道,并由执行script1.sh
并传递给子 shellscript2.sh
进行读取的子 shell 进行修改。
当使用EXPORT
或将变量声明为全局变量时,可以将变量从父变量(main.sh
(传递给子变量进行读取。例如。
#!/usr/bin/env bash
# This is main.sh
export count=5
./script2.sh
#!/usr/bin/env bash
# This is script2.sh
echo "$count"
运行方式如下:
$./main.sh
5
无法修改变量:
#!/usr/bin/env bash
# This is main.sh
export count=5
./script1.sh
./script2.sh
#!/usr/bin/env bash
# This is script1.sh
count=7
运行方式如下:
$./main.sh
5
你能做什么?
如果要修改父变量,则必须要求script1.sh
通过/dev/stdout
返回值,然后捕获它。
然后你有两个选择:
声明
count
全局变量#!/usr/bin/env bash # This is main.sh export count=5 count=$(./script1.sh) ./script2.sh
传递
count
as 和参数#!/usr/bin/env bash # This is main.sh count=$(./script1.sh) ./script2.sh "$count" #!/usr/bin/env bash # This is my script2.sh count="$1" echo "$count"
运行方式如下:
$./main.sh
7
另一种解决方案是利用source
:
#!/usr/bin/env bash
# This is my main.sh
source ./script1.sh
source ./script2.sh
执行脚本时,要打开新外壳,在新外壳中键入命令,将输出复制回当前外壳,然后关闭新外壳。对环境的任何更改将仅在新 shell 中生效,并且在新 shell 关闭后将丢失。
获取脚本时,您是在当前 shell 中键入命令。对环境所做的任何更改都将生效并保留在当前的 shell 中。
来源:超级用户:执行 bash 脚本与获取脚本有什么区别