escaping - 从sh中生成sh代码: 转义

  显示原文与译文双语对照的内容
0 0

包含一个包含 shell 元字符的字符串的shell 变量( 我们将呼叫 x ) 。 例如我可能有


abc"def's" ghi

按如下方式设置


x='abc"def'''s" ghi'

我想从字符串( 存储在文件中,而不是被执行) 生成一个 shell 命令。 我有什么选择呢?


echo"prog $x">> file # Doesn't work
echo"prog '$x'">> file # Doesn't work
echo"prog "$x"">> file # Doesn't work

当前解决方案使用 sed


y=`echo"$x" | sed 's/([^a-zA-Z0-9._-/])/1/g'`
echo"prog $y">> file

输出如下( 虽然同样的输出也可以接受):


prog abc  "def's"  ghi

问题是,需要完成的地方数量正在增加。 谁有更好的解决方案?

注释:

  • 必须为 sh ( 与 bash 相对应) 工作,任何 sh 都可能被合理地命名为( 比如 。 sh 仿真模式中的bash ) 。
  • 它必须像( Windows 已经排除) 一样便携。
  • 虽然不能接受 perl,但其他unix工具的使用却在任何地方都有可能被发现。
时间: 原作者:

0 0

sh 具有函数。


# quote() - Creates a shell literal
# Usage: echo"...$( quote"..." )..."
quote() {
 case"$1" in
 '') echo"''" ;;
 *) echo"$1" | sed 's/([^a-zA-Z0-9._-/])/1/g' ;;
 esac
}

测试:


$ x='abc"def'''s" ghi'

$ echo"$x"
abc"def's" ghi

$ echo"prog `quote"$x"`"
prog abc  "def's"  ghi

$ echo"prog $( quote"`pwd`" )"
prog/home/ikegami/foo bar

原作者:
...