bash - 转义字符的函数?

bash - 转义字符的函数?

我正在尝试自动化我的一些东西并面临一个问题,问题归结为转义作为参数传递给脚本的值。

myScript.sh

#!/bin/bash

loadPatch -name $1

$1第一个参数在哪里,可以具有类似于“p12.9.5-bug34”的值

运行它作为

myScript p12.9.5-bug34

没有结果。我检查echo $?输出是否成功,但所需的操作没有发生。

$1用这个实际值替换了脚本中的测试,它按预期工作。我无法放入打印语句loadPatch来验证它收到的参数。

所以,我设想这里存在一些转义问题,因此需要知道,是否有任何函数/实用程序可以在使用之前用来转义参数?

如果您发现任何其他错误,请告诉我?

答案1

回答一下这个问题,因为其他人可能会搜索这个标题:

  • 仅限 zsh:print -r -- ${(q)var} ${(qq)var} ${(qqq)var} ${(qqqq)var} 用于不同类型的引用。
  • ksh93、zsh 或 bash:printf %q "$var"
  • BusyBox(以及以上所有)。

    使用 vars 消除了 ash、bash 和 ksh 之间的差异:

    q1="'"
    q2="'\''"
    printf '%s\n' "'${var//$q1/$q2}'"
    

    不在 dash 和旧 shell 中(那些缺少 ${var//pat/str} 的 shell)。

  • 最便携?

    printf "'%s'\n" "$(printf '%s' "$var" | sed "s/'/'\\\\''/g")"
    
    Or
    
    printf '%s\n' "$var" | sed "s/'/'\\\\''/g; 1s/^/'/; \$s/$/'/"
    

很高兴欢迎改进!

答案2

我同意该文件名中的特殊字符不应该有问题。

我发现有时脚本没有在我期望的文件夹中运行。如果您将“loadPatch -name”替换为“echo”,您可以验证 $1 是否是您所期望的。如果这是您所期望的,则添加以下行以查看当前目录是否是您所期望的:

ls -l $1
pwd

相关内容