【发布时间】:2015-02-09 04:54:03
【问题描述】:
我有一个由 rotate13 启发的脚本,我想在其中将输入的字符串转换为预先确定但看似随机的输出字符串。这是我想用来从可读字符串转换为随机输出$pWCR 的两个命令,以及从(看似)随机字符串到原始可读字符串$pWCO 的免费转换命令。
pWCR=$(echo $origStr|tr 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>' '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S')
pWCO=$(echo $randStr|tr '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S' 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>')
所以问题是包含管道字符 | 的字符串包含在要翻译的任一字符串中导致字符串被拆分,实际上在管道字符处截断(而不是拆分),就好像它正在我猜读为逻辑或。但是因为它是在单引号内翻译的,所以我认为不应该对 char 进行字面解释。我试图逃避管道字符,但它没有明显的影响。
谁能在这里权衡一下,让我知道我的翻译命令哪里出错了。我可以简单地省略管道字符,但我想知道为什么在这种情况下必须省略它,当然更喜欢将它保存在字符池中进行翻译,这样用户就不会不必要地看到字符列表是无效的。单引号当然已经被排除在外,但如果可能的话,我想将排除的字符列表保留为那个字符。
更新:
@choroba:好的,感谢您指出该命令实际上在 CLI 上运行良好,这迫使我更仔细地查看处理变量 $origStr 和 $randStr 的代码。
我正在使用yad 表单文本框来提示用户输入要翻译的字符串。在仔细检查yad 命令之前,我忘记了它使用管道字符“|”作为默认字段分隔符,因此是破解包含管道字符的输入字符串的罪魁祸首。
userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" " --form \
--field="Enter random string to restore its readable value: " '' \
--button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"
origStr=$(echo "$userDets"|sed -r 's/^([^|]*)\|.*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"
将分隔符更改为空格后,如下所示:
userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" --separator=" " --form \
--field="Enter random string to restore its readable value: " '' \
--button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"
origStr=$(echo "$userDets"|sed -r 's/^([^ ]*) .*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"
脚本按需要运行。
【问题讨论】:
-
你使用什么输入法?它对我有用。