如何在bash中定义包含variabe的变量名?

如何在bash中定义包含variabe的变量名?,bash,Bash,我想定义以下内容: COMMIT_ID_${ARCH}=$(git log --format="%H" -n 1) 但它失败了: -bash:COMMIT_ID_amd64=a7c9e0a53972a3d42a8035f45469f1959a0475f8:未找到命令 您可以为此使用declare指令: declare "COMMIT_ID_${ARCH}"=$(git log --format="%H" -n 1) 要检查新变量的使用,请执行以下操作: declare -p "COMMIT_

我想定义以下内容:

COMMIT_ID_${ARCH}=$(git log --format="%H" -n 1)
但它失败了:

-bash:COMMIT_ID_amd64=a7c9e0a53972a3d42a8035f45469f1959a0475f8:未找到命令


您可以为此使用
declare
指令:

declare "COMMIT_ID_${ARCH}"=$(git log --format="%H" -n 1)
要检查新变量的使用,请执行以下操作:

declare -p "COMMIT_ID_${ARCH}"

根据OP的以下评论:

# create your variable
var="COMMIT_ID_${ARCH}"

# set variable by calling git log
declare "$var"=$(git log --format="%H" -n 1)

# examine value of $var
echo "${!var}"

您可以为此使用
declare
指令:

declare "COMMIT_ID_${ARCH}"=$(git log --format="%H" -n 1)
要检查新变量的使用,请执行以下操作:

declare -p "COMMIT_ID_${ARCH}"

根据OP的以下评论:

# create your variable
var="COMMIT_ID_${ARCH}"

# set variable by calling git log
declare "$var"=$(git log --format="%H" -n 1)

# examine value of $var
echo "${!var}"

使用关联数组

declare -A commit_id

commit_id[$ARCH]=$(git log --format="%H" -n 1)

...

echo "${commit_id[$ARCH]}"

使用关联数组

declare -A commit_id

commit_id[$ARCH]=$(git log --format="%H" -n 1)

...

echo "${commit_id[$ARCH]}"


以后如何引用变量?因为虽然可以通过declare+间接扩展使用动态变量,但使用关联数组通常更简单、可读性更强。除非有两个变量,如
COMMIT\u ID\u x86
COMMIT\u ID\u arm
,否则,定义
COMMIT\u ID\u x86
而不是简单地定义
COMMIT\u ID
,没有任何好处。我将有两个。我使用了echo$COMMIT\u ID\uu${ARCH}。我实际上并没有像脚本中那样对它进行响应,而是在sed替换中使用它。所有关于间接寻址的问题都可以通过以后如何引用变量来回答?因为虽然可以通过declare+间接扩展使用动态变量,但使用关联数组通常更简单、可读性更强。除非有两个变量,如
COMMIT\u ID\u x86
COMMIT\u ID\u arm
,否则,定义
COMMIT\u ID\u x86
而不是简单地定义
COMMIT\u ID
,没有任何好处。我将有两个。我使用了echo$COMMIT\u ID\u${ARCH}。实际上,我并没有像在脚本中那样对它进行响应,而是在sed替换中使用它。关于间接寻址的所有问题都由我在前面尝试过的方法回答,但它没有返回正确的值:echo$COMMIT\u ID\u${ARCH}返回amd64。如果可能的话,我不希望每次需要实际值时都必须运行declare-p。实际上,我并没有重复它,因为它在脚本中,并且在sed替换中使用。声明用法的清晰解释,谢谢。不幸的是,尽管它仍然给我留下了变量名中没有$ARCH ref的问题,因为我将有amd64和arm64v8,并且需要区分它们。在上述运行之后,您将创建两个不同的变量
COMMIT\u ID\u amd64
COMMIT\u ID\u amd64v8
。它们都不会被称为var吗?
var
只是一个临时的持有者。在何处以及如何使用这两个变量?我在前面尝试过,但它没有返回正确的值:echo$COMMIT\u ID\u${ARCH}返回amd64。如果可能的话,我不希望每次需要实际值时都必须运行declare-p。实际上,我并没有重复它,因为它在脚本中,并且在sed替换中使用。声明用法的清晰解释,谢谢。不幸的是,尽管它仍然给我留下了变量名中没有$ARCH ref的问题,因为我将有amd64和arm64v8,并且需要区分它们。在上述运行之后,您将创建两个不同的变量
COMMIT\u ID\u amd64
COMMIT\u ID\u amd64v8
。它们都不会被称为var吗?
var
只是一个临时的持有者。您将在何处以及如何使用这两个变量?该声明似乎不会跨函数持久化。你知道我如何解决这个问题吗?在函数中,将
-g
标志添加到
declare
命令以使数组成为全局变量。我将它移到函数外部,它工作了,但我认为-g并将其保持在s内更好。感谢您的帮助。声明似乎不会在函数之间持久存在。你知道我如何解决这个问题吗?在函数中,将
-g
标志添加到
declare
命令以使数组成为全局变量。我将它移到函数外部,它工作了,但我认为-g并将其保持在s内更好。谢谢你的帮助。