虽然export gg我得到了未绑定的变量gg

时间:2017-12-15 15:44:22

标签: linux bash

  

include.sh

#!/bin/bash -

export gg

f() {
    for i in "${gg[@]}"
    do
        echo $i
    done
}
  

run.sh

#!/bin/bash -

set -o nounset

. include.sh || exit 1

f

我收到此错误

scripts/include.sh: line 5: gg[@]: unbound variable

不是export关键字应该使gg全局并且可以在任何地方使用吗? 如果没有,如何从include.sh到处都可以使用gg?

更新

环境:

$ cat /etc/*-release
NAME="SLES"
VERSION="11.4"
VERSION_ID="11.4"
PRETTY_NAME="SUSE Linux Enterprise Server 11 SP4"

2 个答案:

答案 0 :(得分:3)

旧版Unix shell不支持()阵列。您应该使用bash调用脚本,并且它们将按预期运行。

如更新后的问题中所述,您需要在导出之前定义gg

gg=()
export gg

我测试了补丁,它运行正常。

答案 1 :(得分:2)

如果source文件(相当于.),则命令在当前shell上下文中执行,因此不需要export。但是,如果使用bash,则使用unset / empty数组将导致set -o nounset终止脚本。为数组指定一些值:

gg=(value1 value2) #can be assigned in both run.sh and/or include.sh

f() {
    for i in "${gg[@]}"; do
       echo "$i"
    done
}

或使用参数扩展来处理:

f() {
   for i in ${gg[@]+"${gg[@]}"}; do
      echo "$i"
   done
}
仅当设置${parameter+word}时,

word才会展开为parameter,否则将被替换。如果您想了解更多有关数组如何使用数组的信息:wiki.bash-hackers.org

如@CharlesDuffy所述,在bash 4.4空数组中不会出现错误。即使没有作业array=()也没有错误。有关更多信息,请参阅:  BashFAQ #112