繁体   English   中英

BASH数组变量名称串联

[英]BASH array variable name concatenating

我在BASH中使用变量串联oder替换有一点问题。 给出的是:

#!/bin/bash
Audio1=(0:ita, 96k, AAC, 2.0, s16le, 48000)   # audio stream definitions
Audio2=(1:rus, 128k, AAC, 2.0, s16le, 48000)  # for use in ffmpeg or
Audio3=(2:klg, 96k, AAC, 1.0, s16le, 48000)   # avconv
# and so on, now processing the audio streams
for ((i=1 ; i<=8 ; i++)) ; do
  Audio="Audio$i"
  Audio=${!Audio}
  if [ ${#Audio[0]} -gt 0 ] ; then
    # do the job with $Audio, here examplaryly:
    echo ${Audio[@]}
  fi
done

预期结果是:

0:ita, 96k, AAC, 2.0, s16le, 48000
1:rus, 128k, AAC, 2.0, s16le, 48000
2:klg, 96k, AAC, 1.0, s16le, 48000

我有:

0:ita,
1:rus,
2:klg,

这只是解决方案的一半,因为每个源数组仅复制第一个元素,而不是完全复制到工作数组$ Audio中。 在PHP中,我可以通过以下方式简单地编写变量名称替换:

for ($i=1; $i<=8; $i++) {
  $Audio = ${'Audio'.$i};     // ← that’s all the magic in PHP ;-)
  if (isset($Audio[0])) {
    // blabla
  }
}

不幸的是,我不能为此应用程序使用PHP。 当然,这是我使用BASH编写的第一批脚本之一。 切换到任何其他编码(例如,许多简单变量而不是少数数组)都不是一种选择。 我必须使用这些预设。 那么,我的错在哪里,怎么了?

问候-伯特

在BASH 4.3+版本中,可以使用declare -n

for ((i=1 ; i<=3; i++)) ; do
   declare -n Audio="Audio$i"
   if [[ ${#Audio[@]} -gt 0 ]]; then
       echo "${Audio[@]}"
   fi
done

0:ita, 96k, AAC, 2.0, s16le, 48000
1:rus, 128k, AAC, 2.0, s16le, 48000
2:klg, 96k, AAC, 1.0, s16le, 48000

-n使NAME成为对由其value命名的变量的引用。 因此,在上面的代码中Audio是包含在值的参考Audio1Audio2Audio3

不使用名称引用,您可以执行以下操作:

Audio1=(0:ita, 96k, AAC, 2.0, s16le, 48000)   # audio stream definitions
Audio2=(1:rus, 128k, AAC, 2.0, s16le, 48000)  # for use in ffmpeg or
Audio3=(2:klg, 96k, AAC, 1.0, s16le, 48000)   # avconv

for i in {1..3}; do
    aryvar="Audio${i}[@]"   # this is the special magic indirect varname
    for value in "${!aryvar}"; do printf "%d\t%s\n" $i "$value"; done
    # ...........^^^^^^^^^^^^ expands to elements of the array
done

输出

1   0:ita,
1   96k,
1   AAC,
1   2.0,
1   s16le,
1   48000
2   1:rus,
2   128k,
2   AAC,
2   2.0,
2   s16le,
2   48000
3   2:klg,
3   96k,
3   AAC,
3   1.0,
3   s16le,
3   48000

我错过了您想要的输出。 这里是:

$ for i in {1..3}; do
    aryvar="Audio${i}[*]"    # note the "*" not "@"
    echo "${!aryvar}"
done
0:ita, 96k, AAC, 2.0, s16le, 48000
1:rus, 128k, AAC, 2.0, s16le, 48000
2:klg, 96k, AAC, 1.0, s16le, 48000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM