首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash我失去了所有的换行符

问Bash我失去了所有的换行符
EN

Stack Overflow用户
提问于 2014-10-04 14:13:17
回答 3查看 1.2K关注 0票数 0

我有一个bash脚本来进行加密:

代码语言:javascript
复制
#!/bin/bash
#encrypt.sh

fn=$1
if [ $# -eq 0 ]
  then
    echo "Filename required..."
fi

echo "Type text. Hit Ctrl-d when done"
keyvariable=$(cat)

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn

我有个脚本要解密:

代码语言:javascript
复制
#!/bin/bash
#decrypt.sh

fn=$1
if [ $# -eq 0 ]
  then
    echo "Filename required..."
fi

cat $fn | gpg --decrypt

示例:

sh encrypt.sh test

代码语言:javascript
复制
Type text. Hit Ctrl-d when done
hello

how

are




you

?

我输入密码并确认。好的太好了。我现在有一个名为"test“的加密文件。

但是,当我去解密“测试”时,输出如下:

sh decrypt test

代码语言:javascript
复制
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
-e hello how are you ?

我失去了所有的换行符!该怎么办呢?

答案其实很简单:

echo -e "$keyvariable" | gpg --symmetric --cipher-algo AES256 > $fn

注意$keyvariable周围的引号。

就这样!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-04 14:25:51

在这一行

代码语言:javascript
复制
echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn

当扩展$keyvariable时,任何嵌入的空格(不仅仅是换行符)都被用来将结果字符串拆分成许多不同的单词。然后,echo将每个单词输出到标准输出,由单个空格分隔。Newline是最明显的“受害者”;您可能会观察到制表符(0x09)被空格替换,以及多次运行的空白被缩小为一个空格。由于文件名的生成(文件名的细节在这里并不重要),还有其他字符也可能发生变化。

解决方案是引用参数展开:

代码语言:javascript
复制
echo -e "$keyvariable" | gpg --symmetric -cipher-algo AES256 > "$fn"

正如其他人所提到的,允许gpg直接从标准输入读取,而不是使用cat来拦截击键并将它们放置在变量中更为简单。

代码语言:javascript
复制
echo "Type text. Hit Ctrl-d when done"
gpg --symmetric --cipher-algo AES256 > "$fn"

(实际上,当gpg直接从终端读取时(如这里所示)与从管道读取(如从echo命令读取时)相比,它的行为可能略有不同。这可以解释为什么你会被提示输入密码。我认为解决方案是告诉gpg通过添加"-“作为最后的参数来具体地从标准输入中读取,但请查阅手册页进行验证。那是,

代码语言:javascript
复制
gpg --symmetric --cipher-algo AES256 - > "$fn"

)

票数 5
EN

Stack Overflow用户

发布于 2014-10-04 14:18:18

不要将其存储在变量中,然后将变量回显到gpg中。把它通通。在您的设置中,您应该通过gpg调用发送cat的输出,而不需要回显。

或者完全不使用cat!删除存储输入的行,并删除回显部分,因此该行只需读取

代码语言:javascript
复制
gpg --symmetric ...
票数 1
EN

Stack Overflow用户

发布于 2014-10-04 14:32:03

问题不是关于gpg,而是关于bash和echo。你少了引号。检查此脚本并查看差异。

代码语言:javascript
复制
s=$(printf "one\ntwo")
echo $s
echo "$s"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26193649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档