我试图转义特殊字符,看起来我已经捕获了除了 $! 的特定组合之外的大多数/几乎所有内容。
如果文件名同时包含 $! 相邻,则此脚本不再捕获这些字符,而是将其删除。
我正在努力完全理解为什么以及如何最好地调整这个脚本以保留“$!”
#run the executable with the params.
eval_args=()
for arg in "${@}"; do
# Parsers previously had single quotes ("'/path/to/rom'" ), this allows those shortcuts to continue working.
removeLegacySingleQuotes=$(echo "$arg" | sed "s/^'//; s/'$//")
escaped_arg=$(printf "%q" "$removeLegacySingleQuotes")
eval_args+=("$escaped_arg")
done
echo "eval ${exe} "${eval_args[*]}""
# If the ROM has an "!" (ex: WarioWare: Twisted!), use set +H to temporarily allow !'s
set +H
eval "${exe}" "${eval_args[@]}"
set -H
例子:
./mgba.sh "WarioWare, Inc. - Mega Microgame$!.gba"
eval /home/deck/Applications/mGBA.AppImage WarioWare\,\ Inc.\ -\ Mega\ Microgame.gba
第二行表明它没有正确保存$!
您正在使用以下方式调用您的脚本:
在脚本执行之前
"$!"
,被最后一个后台 pid替换。如果您想保留字符串的字面值,则必须在写入时对其进行转义。或者
您的脚本非常简单 - 它应该只传递正确引用的参数扩展并调用 exe。您的脚本中无需执行任何操作。只是:
使用 shellcheck 检查您的脚本。
set -x
使用交互式 shell调试脚本。您可以使用单引号
'
。将字符串包含在其中可以使其不受扩展和命令替换的影响。单引号:
双引号: