rot13-like translate命令中的pipe char在管道中分割单词

时间:2015-02-08 19:12:18

标签: string bash tr

我有一个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!@#$%^&*()\-_=+|\\[{]};:",./?<>')

所以问题是包含要转换的字符串中包含的管道字符|的字符串会导致字符串被拆分,实际上在管道字符处被截断(而不是拆分),就好像它一样正在被读作逻辑或我猜。但因为它是在单引号内翻译的,所以我认为不应该出现对字符的字面解释。我试图逃避管道炭,但它没有明显的影响。

有人可以在这里权衡,让我知道我的翻译命令出错的地方。我可以简单地省略管道字符,但我想知道为什么必须省略它,如果是这种情况,当然更喜欢将它保存在字符池中进行翻译,这样用户就不会不必要地显示字符列表那是无效的。单引号当然已被排除在使用之外,但如果可能的话,我想将排除的字符列表保留为该字符。

更新
@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"

脚本可以根据需要运行。

1 个答案:

答案 0 :(得分:1)

我能用这两个语句看到的唯一问题是$ origStr和$ randStr没有用双引号括起来。

这会导致问题并可能导致您的问题,但我无法完全复制您的说明。