假设我有
- 一个 bash 脚本
A.bash
,它调用另一个脚本B.bash
。 B.bash
计算一个变量VAR
。- 现在我想
B.bash
回到VAR
调用脚本。
我可以导出 和来源。VAR
_ 另一种解决方案是回显,执行并获取返回值。B.bash
B.bash
A.bash
VAR
B.bash
B.bash
A.bash
R=$(B.bash)
是否有意义?哪个选项更好?有没有其他选择?
按照惯例,Shell 脚本在成功时返回 0,否则返回非零。
最好的办法是通过 shell 变量传递它。
A.bash
:
unset VAR
source B.bash
echo $VAR
B.bash
:
export VAR=value
当我使用 bash 函数时,我会这样做:
function myfunc()
{
local myresult='some value'
echo "$myresult"
}
result=$(myfunc) # or result=`myfunc`
echo $result
希望有帮助。
跟踪分叉(如$()
),因为它们比正常(顺序)执行消耗更多的资源,如果您知道必须提前修改哪个变量,您最好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 伪文件系统,没有访问时间)访问功能需要一些时间。
$(...)
或者...
对于返回二进制命令或其他强脚本的结果很有用,其中有很多你不会继承的变量。mapfile
,或者尽可能使用read -a
。这个只关注bash!如果您希望您的脚本是可移植的(即使bash
已经移植到最重要的操作系统上),您必须不使用数组变量并尝试使用您的脚本zsh
or dash
。