0

我正在编写一个 Shell 脚本,但出现了一个意外错误(我以前从未见过)。

代码是这样的:

 num=1

 case $line in
    *.mp3*)
    s$num=$total_seconds; # $total_seconds is a variable with numbers like: 11.11
    a$num=$file;
    num=$(($num + 1));
    ;;
 esac

如果我尝试查看这些变量的内容,它不会显示任何内容。

echo $s1 $a1
echo $s2 $a2

甚至:

for ((i=1; i<=$num; i++))
do
  echo $s$i $a$i
done
4

2 回答 2

2

如果您可以使用 bash(或任何支持数组的 shell),请使用数组:

num=1
declare -a s
declare -a a
case $line in
    *.mp3*)
        s[num]=$total_seconds # $total_seconds is a variable with numbers like: 11.11
        a[num++]=$file
        ;;
esac

如果你想要一些 POSIXly 严格的东西,那么事情就会变得更加艰难。在不了解您的代码的情况下,我不想对此提出任何建议。

Aside:是一个带有类似 11.11的字符串$total_seconds的变量。这些 shell 不支持浮点数。

于 2013-02-04T20:40:51.340 回答
2

bash仅当 LHS 是文字而非表达式时才识别变量赋值。虽然您可以稍微修改您的代码以获得这样的动态生成的变量名称:

num=1

case $line in
  *.mp3*)
  declare s$num=$total_seconds; # $total_seconds is a variable with numbers like: 11.11
  declare a$num=$file;
  num=$(($num + 1));
  ;;
esac 

一个更好的主意是使用 kojiro 建议的数组。

要动态访问它们,您需要使用间接扩展:

num=1
var="s$num"
echo ${!var}  # var must be the name of a variable, not any other more complex expression
于 2013-02-04T20:46:52.003 回答