Bash

為什麼我需要禁用=SC2031

  • July 29, 2022

你能告訴我,為什麼我必須# 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給出相同的警告?

因為前一行以 結束|,所以while ... do ... done循環是管道的一部分:您正在管道進入循環

因此,循環可能會在子 shell 中執行,因此對變數的任何更改LOCAL_NAMES可能LOCAL_HOSTS會失去,具體取決於您實際用於執行此腳本的 shell:它將與 一起使用,ksh如果你有’s選項集。zsh``bash``bash``lastpipe

使用其他 shell,或者使用bash’s 的出廠預設設置,它將失敗。

您對https://www.shellcheck.net/wiki/SC2031的解釋不清楚嗎?

引用自:https://unix.stackexchange.com/questions/711703