如何在 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
答案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