Bash 可以将变量转储为 shell 转义字符串:
$ X='1 2 te$t'; Y=$' \a\n\t '; printf '%q %q\n' "$X" "$Y" > .data
$ cat .data
1\ 2\ te\$t $' \a\n\t '
是否可以从文件 .data 中恢复变量 X 和 Y?它应该是安全的,即使 .data 包含
$(rm -rf /*)
。我正在寻找以“每条记录一行”格式存储记录(变量 X、Y)的方法。
编辑
在我的任务中,
printf '%q'
可能会被 Python 中的 urlquote 替换。解决方案:$ X='1 2 te$t'; Y=$' \a\n\t ';
$ alias urlquote="python -c'import urllib, sys; print urllib.quote(sys.stdin.read())'"
$ alias urlunquote="python -c'import urllib, sys; print urllib.unquote(sys.stdin.read())'"
$ echo $(echo -n "$X" | urlquote) $(echo -n "$Y" | urlquote) > .data
$ cat .data
1%202%20te%24t %20%07%0A%09%20
$ while read -r x y; do
> x=$(echo "$x" | urlunquote)
> y=$(echo "$y" | urlunquote)
> printf '%q %q\n' "$x" "$y"
> done < .data
1\ 2\ te\$t $' \a\n\t '
最佳答案
更新的答案:
printf %q 的输出,据我所知,没有 eval 就无法重构,并且 eval 总是容易受到任意命令执行的影响。您需要使用 bash 不直接支持的编码,例如使用 base64:
#!/bin/bash
X='1 2 te$t';
Y=$' \a\n\t ';
echo "$(base64 -w0<<<"$X") $(base64 -w0<<<"$Y")" > .data
cat .data|while read line; do
X2=$(base64 -d<<<${line%% *})
Y2=$(base64 -d<<<${line#* })
printf "%q %q\n" "$X2" "$Y2"
done
(原始答案已删除,请参阅帖子历史记录)
关于bash - 读取 printf '%q' "$VAR"的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8016363/