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

将参数从一个脚本传递到另一个脚本-Shell脚本,shell,unix,Shell,Unix,我有一个主脚本.sh,它将调用子脚本 我想在主脚本中访问sub_脚本中的一个变量 我尝试使用变量“export”和“env”,但当我尝试在main_脚本中回显它时,我没有得到值 例如: sub_script.sh export a=hello echo $a $PGMHOME/sub_script.sh > output_file echo $a main_script.sh export a=hello echo $a $PGMHOME/sub_script.sh > out

我有一个主脚本.sh,它将调用子脚本

我想在主脚本中访问sub_脚本中的一个变量

我尝试使用变量“export”和“env”,但当我尝试在main_脚本中回显它时,我没有得到值

例如:

sub_script.sh

export a=hello
echo $a
$PGMHOME/sub_script.sh > output_file
echo $a
main_script.sh

export a=hello
echo $a
$PGMHOME/sub_script.sh > output_file
echo $a
仅供参考:sub_script.sh正在正确执行,因为我在输出_文件中获得了“a”的值 但是当我重复main_脚本中a的值时,我没有得到它

p、 s:我知道我可以直接在main_sript.sh中分配变量,但这只是一个例子,我在sub_script.sh中进行了大量处理(
export
-ed变量)只“向下”(从父进程到子进程)传递,而不是向上传递

这意味着,如果要将主脚本中的子脚本作为进程运行,子脚本必须将名称和值写入某个位置,以便父进程(主脚本)可以读取和处理它们

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

eval $(./sub_script)
这其中有很多陷阱(当然,包括子脚本可以打印
rm-rf$HOME
,主脚本可以执行,当然子脚本可以直接这样做,但是意外地打印不好的东西比意外地打印不好的东西更容易,所以这是一个示例)。请注意,子脚本必须仔细引用以下内容:

#! /bin/sh
# sub-script
echo a=value for a
eval
ed时,这会失败,因为
a的值在单词边界上被分割,并且
eval
s将运行
a=value
set的
。子脚本必须使用类似以下内容:

echo a=\'value for a\'
这样主脚本的
eval$(./sub_script)
就会看到一个带引号的赋值

如果子脚本需要将输出发送到标准输出,则需要将其变量设置写入其他位置(可能写入临时文件,也可能写入主脚本中设置的文件描述符)。请注意,如果将输出发送到包含stdout的文件,则主脚本确实可以仔细阅读该文件(而不是使用简单的
eval

另一种选择(仅在某些情况下可用,而不是在所有情况下)是从主脚本中获取子脚本的源代码。这允许子脚本直接访问主脚本中的所有内容。这通常是最简单的方法,因此通常是最好的方法。要生成子脚本,可以使用
命令:

#! /bin/sh
# main script
# code here
. ./sub_script  # run commands from sub_script
# more code here

传递给脚本的参数有$1、$2等。您可以从sub_script.sh调用main_script.sh,然后再次调用main_script.sh

main_script.sh

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

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

#!/bin/sh
echo "main_script"
./sub_script.sh "hello world!"
#!/bin/sh
if [ "${1}" = "" ]; then
    echo "calling main_script"
    ./main_script.sh
else
    echo "sub_script called with parameter ${1}"
fi
正在调用主脚本
主脚本
使用参数hello world调用sub_脚本


我会给出
源代码下标
作为主要建议,但可能对
评估
一无所知。当你还不理解点的时候,你的上一个代码是混乱的:你有12个点代替了其他东西,2个点必须按字面理解;我用评论代替了它们。