如何在Linux中使用用户输入的变量值从一个Shell脚本转换为另一个Shell脚本?

时间:2018-10-02 13:48:43

标签: shell

我有一个三层脚本,在这里我必须使用从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

1 个答案:

答案 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