你能告诉我,为什么我必须# shellcheck disable=SC2030
在下面的脚本中?
get_names_and_hosts(){
unset LOCAL_HOSTS
declare -a LOCAL_HOSTS
unset LOCAL_NAMES
declare -a LOCAL_NAMES
multipass list --format json | jq -r '.list[] | [ .name, .ipv4[0] ] | @tsv' |
while IFS=$'\t' read -r name ipaddress; do
# shellcheck disable=SC2030
LOCAL_NAMES+=("$name")
# shellcheck disable=SC2030
LOCAL_HOSTS+=($ipaddress)
done
# shellcheck disable=SC2031
reply=("${LOCAL_NAMES[@]}" "${LOCAL_HOSTS[@]}")
echo "${reply[@]}"
}
声明为declare -gx
给出相同的警告?
答案1
因为上一行以 结尾|
,所以while ... do ... done
循环是管道的一部分:您是管道成循环。
因此,循环可能在子 shell 中执行,因此对变量LOCAL_NAMES
和的任何更改LOCAL_HOSTS
都可能会丢失,具体取决于您实际使用哪个 shell 来运行此脚本:它将与 一起工作,ksh
如果您有s选项集。zsh
bash
bash
lastpipe
对于其他 shell,或者使用bash
的出厂默认设置,它将失败。
解释是关于https://www.shellcheck.net/wiki/SC2031你不清楚吗?