bash动态(变量)变量名


12

我想通过操作元素数组并创建一些算术过程来动态创建字符串序列。

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "\n"
done

期望的结果将是$6平等0

1q;d
2q;d
3q;d
4q;d
5q;d

但是我得到这个错误

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution

我想这很简单。当我做类似的事情时它曾经工作

FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"

1
你能解释得更好一点吗?不太了解您要做什么。
神经元

$ name = $((($ 6 + 1)))应该做什么?
PSkocik 2015年

我希望做的FIRST=$(( $6 + 1 ))
@PSkocik

Answers:


16

首先,=中的变量声明中不能有空格bash

要获得想要的东西,可以使用eval

例如像您的示例脚本:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

版画:

1q;d
2q;d
3q;d
4q;d
5q;d

eval谨慎使用,有些人出于某些正当理由将其称为邪恶。

declare 也会工作:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

还可以打印:

1q;d
2q;d
3q;d
4q;d
5q;d

!感叹号是printf '%s\n' "${!name}"做什么用的?
giannis christofakis

1
其所谓的间接扩张bash参数expansion..read
heemayl

1
击也有一个更好的替代品declare/ evalprintf -v varname '%fmt' args。一些bash补全内部函数将其用于按引用调用。(传递要存储的变量名)。
彼得·科德斯

注意:declare仅使用会在本地范围内设置变量,而此eval方法会全局设置它。
用户

11

如果要在将名称存储在另一个变量中的同时引用bash变量,则可以按以下步骤进行操作:

$ var1=hello
$ var2=var1
$ echo ${!var2}
hello

在这种情况下,您将要访问的变量的名称存储在var2中。然后,使用${!<varable name>}其中<variable name>包含要访问的变量名称的变量来访问它。


有便携的方法eval var=\$$holder但是eval危险!
Givenkoa

1
index=0;                                                                                                                                                                                                           
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    name=$(($index + 1))
    echo "${name}q;d"
    index=$((index+1))
done

那是您要尝试的吗?


1

我从您的代码和所需的输出中得到的信息(如果我错了,请纠正我):
没有使用“ FIRST” /“ SECOND” / ...变量名,您只需要一个带有索引的循环。 。

这将完成工作:

for i in {1..5} ; do echo $i"q;d" ; done


是的,您是对的,除了我还想用一个变量做一个算术函数。
giannis christofakis

您可以举这个算术函数的例子吗?您是否需要变量名(例如“ THIRD”)或仅需要索引值?
csny

SUM=$(($6 + $i)); echo $SUM"q;d",我知道自己做错了。
giannis christofakis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.