AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 452723
Accepted
Rafael Muynarsk
Rafael Muynarsk
Asked: 2018-06-30 14:38:29 +0800 CST2018-06-30 14:38:29 +0800 CST 2018-06-30 14:38:29 +0800 CST

是否可以使用 shell 脚本打印变量内容的内容?(间接引用)

  • 772

假设我已经声明了以下变量:

$ var='$test'
$ test="my string"

如果我打印他们的内容,我会看到以下内容:

$ echo $var
$test

$ echo $test
my string

我想找到一种方法来打印内容的内容$var(即 的内容$test)。所以我尝试执行以下操作:

$ echo $(echo $var)
$test

但是这里的结果是$test而不是"my string"......是否可以使用bash打印变量内容的内容?

bash shell-script
  • 4 4 个回答
  • 11422 Views

4 个回答

  • Voted
  1. Best Answer
    jesse_b
    2018-06-30T14:41:33+08:002018-06-30T14:41:33+08:00

    您可以使用 bash 的间接变量扩展来完成此操作(只要您可以$从参考变量中省略 ):

    $ var=test
    $ test="my string"
    $ echo "$var"
    test
    $ echo "${!var}"
    my string
    

    3.5.3 Shell参数扩展

    • 23
  2. Danila Kiver
    2018-06-30T14:48:39+08:002018-06-30T14:48:39+08:00

    对于包含在其中的变量名称var以您为前缀的情况,$可以使用eval:

    $ var='$test'
    $ test="my string"
    $ eval echo $var
    my string
    

    这里会发生什么:

    • bash 扩展$var为 value $test,产生一个eval echo $test命令;
    • eval计算echo $test表达式并产生所需的结果。

    请注意,eval通常使用可能是危险的(取决于存储在 中的内容var),因此最好避免使用它。间接扩展功能更适合您的情况(但您需要摆脱$登录$test)。

    • 11
  3. Kusalananda
    2018-06-30T23:11:18+08:002018-06-30T23:11:18+08:00

    类似于Jesse_b's answer,但使用名称引用变量而不是变量间接(需要bash4.3+):

    $ declare -n var=test
    $ test="my string"
    $ echo "$var"
    my string
    

    名称引用变量var保存它所引用的变量的名称。当变量被取消引用为$var时,将返回其他变量的值。

    bash递归解析名称引用:

    $ declare -n var1=var2
    $ declare -n var2=test
    $ test="hello world"
    $ echo "$var1"
    hello world
    

    为了完整起见,使用关联数组(在bash4.0+ 中)也是解决此问题的一种方法,具体取决于要求:

    $ declare -A strings
    $ strings[test]="my string"
    $ var=test
    $ echo "${strings[$var]}"
    my string
    

    这提供了一种通过可以动态确定的键或名称访问多个值的更灵活的方式。如果您想在单个数组中收集特定类别的所有值,但仍然能够通过某些键(例如,可通过 ID 访问的名称,或可通过目的访问的路径名等)访问它们,这可能会更可取,因为它不会造成污染脚本的变量命名空间。

    • 9
  4. Stéphane Chazelas
    2018-07-01T22:53:14+08:002018-07-01T22:53:14+08:00

    与zsh:

    $ var='$test'
    $ test='*'
    $ printf '%s\n' ${(e)var}
    *
    

    使用任何类似 Bourne 的外壳

    $ eval 'printf "%s\n" "'"$var"'"'
    *
    

    请记住,在这些 shell 中,必须引用变量扩展以防止 split+glob (zsh作为一个例外)并且echo不能用于任意数据。

    由于两者(e)都有evalshell 代码评估,重要的是$var保持在您的控制范围内,否则可能是任意命令注入漏洞(与${!var}方法相同)。

    • 3

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve