0

假设我有

  • 一个 bash 脚本A.bash,它调用另一个脚本B.bash
  • B.bash计算一个变量VAR
  • 现在我想B.bash回到VAR调用脚本。

我可以导出来源VAR_ 另一种解决方案是显,执行并获取返回值。B.bash B.bashA.bash VARB.bash B.bashA.bashR=$(B.bash)

是否有意义?哪个选项更好?有没有其他选择?

4

3 回答 3

2

按照惯例,Shell 脚本在成功时返回 0,否则返回非零。

最好的办法是通过 shell 变量传递它。

A.bash

unset VAR
source B.bash
echo $VAR

B.bash

export VAR=value
于 2013-01-21T16:18:54.783 回答
1

当我使用 bash 函数时,我会这样做:

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

result=$(myfunc)   # or result=`myfunc`
echo $result

希望有帮助。

于 2013-01-21T16:17:20.320 回答
1

小介绍

跟踪分叉(如$()),因为它们比正常(顺序)执行消耗更多的资源,如果您知道必须提前修改哪个变量,您最好local在整个脚本周围使用定义并使用函数而不是必须制作文件命令之间的访问:

#!/bin/bash
# There is the `A` script

local VAR

function B() {
    read -a VAR </proc/uptime
}

B
echo $VAR
sleep 1
B
echo $VAR

可以输出类似:

1610291.39
1610292.39

访问时间/bin/sleep可能小于 1/100 秒。

一个小示范:

local V1
B1() {
    read -a V1 </proc/uptime
}
B1 ;echo $V1 ;for i in {0..10000} ;do B1 ;done ;echo $V1
1610843.78
1610844.38
printf "%d 1/100th of sec\n" $((161084438-161084378))
60 1/100th of sec

我可以在 60/100 秒内设置 10000 倍我的变量,而

B2() {
    local var
    read -a var </proc/uptime
    echo $var
}
V2=$(B2);echo $V2;for i in {0..10000};do V2=$(B2);done;echo $V2
1611121.33
1611168.01
printf "%d 1/100th of sec\n" $((161116801-161112133))
4668 1/100th of sec

可能需要更多时间!

如果您真的想将所有内容保存在单独的文件中,正如@alok 建议的那样,您可以使用source它们,因为这不会分叉:

echo >/dev/shm/B3 'read -a V3 </proc/uptime'
. /dev/shm/B3 ;echo $V3 ; for i in {0..10000};do . /dev/shm/B3;done;echo $V3
1612187.89
1612188.79
printf "%d 1/100th of sec\n" $((161218879-161218789))
90 1/100th of sec

这比必须为每个循环分叉要快得多,但是通过文件系统(甚至是 RAM 伪文件系统,没有访问时间)访问功能需要一些时间。

我的答案

  1. 是的,这是有道理的,同时$(...)或者...对于返回二进制命令或其他强脚本的结果很有用,其中有很多你不会继承的变量。
  2. 取决于您的需要以及每个部分的编写者...并行性...其他因素...
  3. 其他替代方案,对于动态命令,不是真的,但不要错过使用内置插件mapfile,或者尽可能使用read -a

免责声明

这个只关注!如果您希望您的脚本是可移植的(即使bash已经移植到最重要的操作系统上),您必须不使用数组变量并尝试使用您的脚本zshor dash

于 2013-01-21T21:33:53.663 回答