You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Shell脚本中的变量传递到内联Ruby命令中使用

问题原因

代码无法生效有两个核心原因:

  • 单引号包裹的字符串在Shell中不会做变量插值,你传给Ruby的代码原封不动就是puts $foo,Shell不会提前把$foo替换成对应的值
  • Ruby运行时的变量空间和Shell的变量空间完全独立,就算没有引号问题,Ruby也无法直接读取Shell的普通变量

解决方案

下面是三种常用的实现方式,按需选择即可:

方式1:利用Shell双引号做变量插值

把-e后的Ruby代码用双引号包裹,Shell会先替换变量内容再把代码传给Ruby执行,适合简单场景:

foo=kroe761
bar=$(ruby -e "puts '$foo'")
echo My name is $bar

注意:如果变量内容包含单引号、特殊字符,或者Ruby代码本身有双引号,需要做转义处理,否则会出现语法错误。

方式2:通过环境变量传递(更稳妥)

将Shell变量作为环境变量传给Ruby进程,Ruby通过内置的ENV哈希读取,无需处理转义,适配所有变量内容:

foo=kroe761
# 仅给当前Ruby进程传递环境变量,不会污染全局Shell环境
bar=$(foo="$foo" ruby -e 'puts ENV["foo"]')
echo My name is $bar

如果后续多个命令都要用到这个变量,也可以提前export:

export foo=kroe761
bar=$(ruby -e 'puts ENV["foo"]')
echo My name is $bar

方式3:作为命令行参数传递

把变量值当成Ruby脚本的入参传递,Ruby通过ARGV数组读取,适合传递多个参数的场景:

foo=kroe761
bar=$(ruby -e 'puts ARGV[0]' "$foo")
echo My name is $bar

内容的提问来源于stack exchange,提问作者kroe761

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:27:03