我有一个三层脚本,在这里我必须使用从script1.sh到script2.sh的用户输入值计数。 如何通过main.sh使用用户输入的值从script1.sh到script2.sh?
scrip1.sh
read -p 'Enter a number:' count
script2.sh
echo "Count:$count"
main.sh
sleep 1 && ./script1.sh
sleep 1 && ./script2.sh
答案 0 :(得分:1)
如何在子外壳中修改全局变量?
这是您的实际问题。
简而言之,您做不到!(请参阅here)
您想让$count
知道变量main.sh
并由执行script1.sh
的子外壳修改并传递给子外壳script2.sh
进行读取
使用main.sh
或将变量声明为全局变量时,可以将变量从父变量(EXPORT
传递给孩子以进行读取。例如
#!/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
作为参数并传递
#!/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中键入命令。对环境的任何更改将生效并保留在您当前的外壳中。
来源:super user: What is the difference between executing a bash script vs sourcing it