【问题标题】:How to accommodate spaces in a variable in a bash shell script?如何在 bash shell 脚本中的变量中容纳空格?
【发布时间】:2011-02-10 00:26:29
【问题描述】:

希望这应该是一个简单的...这是我的 test.sh 文件:

#!/bin/bash
patch_file="/home/my dir/vtk.patch"
cmd="svn up \"$patch_file\""
$cmd

注意“我的目录”中的空格。当我执行它时,

$ ./test.sh 
Skipped '"/home/my'
Skipped 'dir/vtk.patch"'

我不知道如何在变量中容纳空间并仍然执行命令。但是在 bash shell 上执行以下操作没有问题。

$ svn up "/home/my dir/vtk.patch"   #WORKS!!!

任何建议将不胜感激!我在 Windows 上使用来自 cygwin 的 bash。

【问题讨论】:

标签: bash variables space unicode-escapes


【解决方案1】:

使用 eval $cmd,而不是普通的 $cmd

【讨论】:

  • @Bala:注意security risks of eval
  • 既然他们可以停止将命令分配给变量,为什么还要告诉他们 eval $cmd(并承担与 eval 相关的所有安全风险)?
  • BashFAQ #50 描述了如何避免在所有常见情况下都需要将命令分配给字符串变量,从而导致某人执行此类操作。
【解决方案2】:

你试过逃离这个空间吗?
通常,UNIX shell 不喜欢文件名或文件夹名中的非标准字符。处理这种情况的正常方法是转义有问题的角色。试试:

patch_file="/home/my\ dir/vtk.patch"

注意反斜杠。

【讨论】:

  • 是的,我试过了。输出,跳过 '"/home/my\' 跳过 'dir/vtk.patch"'
  • @Dave,这不是转义问题:在参数扩展完成后,不会解析包括引号和转义在内的语法字符。阅读 BashFAQ #50 描述 OP 的问题和可用的最佳实践解决方案的范围(均不涉及 eval!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
相关资源
最近更新 更多