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