将参数从一个脚本传递到另一个脚本 - Shell Scripting

时间:2016-03-12 02:33:25

标签: shell unix

我有 main_script.sh ,会调用 sub_script

我在sub_script中有一个变量,我想在主脚本中访问

我尝试使用变量“export”和“env”,但是当我试图在main_script中回显它时,我没有得到值。

例如:

sub_script.sh

export a=hello
echo $a

main_script.sh

$PGMHOME/sub_script.sh > output_file
echo $a

仅供参考:sub_script.sh正在执行,因为我在output_file中获得了'a'的值 但是当我在main_script中回显a的值时,我没有得到它。

p.s:我知道我可以直接在main_sript.sh中分配变量,但这只是一个例子,我在sub_script.sh中完成了大量处理

2 个答案:

答案 0 :(得分:1)

环境(visible-xs - ed变量)仅“向下”传递(从父进程到子进程),而不是向上传递。

这意味着如果要从主脚本作为进程运行子脚本,则子脚本必须在某处写入名称和值,以便父进程(主脚本)可以阅读和处理它们。

有很多方法可以做到这一点,包括简单地将它们打印到标准输出并让父脚本export成为结果:

eval

这有很多陷阱(当然,包括子脚本可以打印eval $(./sub_script) 并且主脚本会执行 - 当然子脚本可以直接执行,但它甚至更容易意外地打印坏事而不是意外地做坏事,所以这可以作为一个例子)。请注意,子脚本必须仔细引用:

rm -rf $HOME

#! /bin/sh # sub-script echo a=value for a 时,由于eval在字边界上被拆分而value for aeval一起设置for a,因此失败了。子脚本必须使用更像:

a=value

以便主脚本的echo a=\'value for a\' 看到引用的作业。

如果子脚本需要将输出发送到标准输出,则需要将其变量设置写入其他位置(可能是临时文件,可能是主脚本中设置的文件描述符)。请注意,如果输出发送到文件 - 这包括stdout,那么主脚本可以仔细读取文件(而不是使用简单的eval $(./sub_script))。

另一个替代方案(仅在某些情况下可用,而不是所有情况下)是来自主脚本的子脚本。这允许子脚本直接从主脚本访问所有内容。这通常是最简单的方法,因此通常是最好的方法。要获取子脚本,您可以使用eval命令:

.

答案 1 :(得分:0)

脚本的参数传递类似于$ 1,$ 2等。您可以从sub_script.sh调用main_script.sh并再次调用main_script.sh。

main_script.sh

#!/bin/sh
echo "main_script"
./sub_script.sh "hello world!"

sub_script.sh

#!/bin/sh
if [ "${1}" = "" ]; then
    echo "calling main_script"
    ./main_script.sh
else
    echo "sub_script called with parameter ${1}"
fi

./ main_script.sh

  

调用main_script
  main_script
  用参数hello world调用sub_script!