在 Bash 中创建 n 个变量而不将它们一一分配?

在 Bash 中创建 n 个变量而不将它们一一分配?

如何在 shell 脚本中创建 n 个变量而不显式分配它们?我的意思是类似于创建var1, var2, var3,...,的循环varx,其中x是我之前设置的变量,例如:

read x

for ((a=0;a<x;++a)); do
 variable$a=${RANDOM}
done

x(我们暂时忽略可能是字符串的可能性。但显然,这是行不通的。如何做到这一点?

我真正想做的是,当我执行脚本时,我在命令行中编写的每个参数都成为它自己的变量ARG1, ARG2...ARGn${1}, ${2},...,${n}作为它的值,所以只会有尽可能多的这些变量作为参数被设置。

答案1

看起来您想使用数组:

read x

for (( a=0; a<x; ++a)); do
   variable[a]=$RANDOM
done

printf 'First value is %s\n' "${variable[0]}"

printf 'All values (one by one): %s\n' "${variable[@]}"
printf 'All values (as one string): %s\n' "${variable[*]}"

对于你问题的第二部分:

arg=( "$@" )

printf 'First command line argument: %s\n' "${arg[0]}"

另请注意,您可以轻松地循环所有命令行参数(或 中发生的任何内容$@),而无需将它们存储在特殊的地方:

for arg do
    printf 'Got command line argument: %s\n' "$arg"
done

答案2

尝试这个,

read x

for ((a=0;a<x;++a)); do
 declare -i variable$a=${RANDOM}
done

宣布命令允许在设置变量属性的同一语句中为变量赋值。

答案3

您需要进行eval分配(但使用数组会更好)。

#!/bin/bash -vx

read x
for ((a=0;a<x;++a)); do
   eval variable$a=${RANDOM}
done

man bash

eval [arg ...]
    The args are read and concatenated together into a single command. 
    This command is then read and executed by the shell, and its exit 
    status is returned as the value of eval.

答案4

怎么样(需要最近的shell)

 for ((a=0;a<x;++a))
   do  read variable$a <<<${RANDOM}
   done

相关内容