在BASH脚本中使用字符串作为变量名

And*_*ndy 9 bash

我有以下内容:

#!/bin/sh

n=('fred' 'bob')

f='n'
echo ${${f}[@]}
Run Code Online (Sandbox Code Playgroud)

我需要在替换后执行底线

echo ${n[@]}
Run Code Online (Sandbox Code Playgroud)

任何方式这样做?我得到了

test.sh: line 8: ${${f}}: bad substitution
Run Code Online (Sandbox Code Playgroud)

在我的结尾.

Mic*_*man 16

你可以使用这样的数组进行变量间接:

subst="$f[@]"
echo "${!subst}"
Run Code Online (Sandbox Code Playgroud)

正如soulmerge所说,你不应该#!/bin/sh为此而使用.我用#!/usr/bin/env bash我的shebang,无论Bash在你的路上在哪里都可以使用.

  • +1间接扩展远不如"eval"那么大. (4认同)

sou*_*rge 5

你可以eval得到所需的行:

eval "echo \${${f}[@]}"
Run Code Online (Sandbox Code Playgroud)

顺便说一句:你的第一行应该是#!/bin/bash,你正在使用像阵列一样的特定于bash的东西

  • 我没有downvote,但总的来说,如果有另一种选择,大多数语言都应该避免像'eval`这样的事情.它们有时会引入微妙的错误或安全风险. (2认同)