如何将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
相关产品推荐
相关产品推荐

