【问题标题】:Bash script for printing Heart shape用于打印心形的 Bash 脚本
【发布时间】:2019-12-31 19:26:48
【问题描述】:

我想编写一个 bash 脚本来回显由字符串组成的形状(心)并在终端中绘制它。像这张照片: 我找到了一个 bash 脚本,但它不起作用。

echo '\x1f\x8b\x08\x00\x95\x10\xe0R\x02\xffSPP\xf0\xc9/KU\x80\x03\x10\x8f\x0bB\xa1c.l\x82dJ\xe0\xb0\x01\xe6\x02\x0cATa.T\xf7\x02\x00\xd9\x91g\x05\xc5\x00\x00\x00'|gunzip

我找到上面的代码并尝试过,但没有成功。

【问题讨论】:

  • 使用echo -ebash
  • 我非常怀疑您是否打算编辑该十六进制字符串以将 Love 替换为其他字符串;最好的办法是按照我在答案中概述的步骤...创建一个带有所需文本“图像”的文件,gzip 文件,然后将 *gz flle 转换为其等效的十六进制字符串;我不确定如何将 *gz 转换为十六进制字符串...所以也许可以将其作为一个新问题提出来?
  • @Ryan:要使用hexdump从文件创建自己的字符串:gzip <file | hexdump -v -e '"\\x" 1/1 "%02X"'; echo '\x00' 然后使用echo -en '...'printf '...'

标签: linux bash terminal


【解决方案1】:

跟进我之前的评论(不确定如何将 *gz 文件转换为十六进制字符串)...

我发现我可以用 base64 做类似的事情,其想法是 base-64 字符串将更容易使用 (ymmv)。

创建一个包含所需文本“图像”的文件,例如:

$ cat heart
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

通过base64 运行文件以生成表示文件内容的base-64(而不是hex==base-16)字符串,例如:

$ base64 heart
ICAgTG92ZSAgICAgICAgICBMb3ZlCiAgTG92ZUxvdmVMb3ZlTG92ZUxvdmUKTG92ZUxvdmVMb3ZlTG92ZUxvdmVMb3ZlCkxvdmVMb3ZlTG92ZUxvdmVMb3ZlTG92ZQpMb3ZlTG92ZUxvdmVMb3ZlTG92ZUxvdmUKICBMb3ZlTG92ZUxvdmVMb3ZlTG92ZQogICAgTG92ZUxvdmVMb3ZlTG92ZQogICAgICBMb3ZlTG92ZUxvdmUKICAgICAgICAgIExvdmUK

此时您可以使用以下修改后的命令将上面的字符串echo 然后通过base64 -d 进行管道传输(即替换`gunzip),例如:

$ echo "ICAgTG92ZSAgICAgICAgICBMb3ZlCiAgTG92ZUxvdmVMb3ZlTG92ZUxvdmUKTG92ZUxvdmVMb3ZlTG92ZUxvdmVMb3ZlCkxvdmVMb3ZlTG92ZUxvdmVMb3ZlTG92ZQpMb3ZlTG92ZUxvdmVMb3ZlTG92ZUxvdmUKICBMb3ZlTG92ZUxvdmVMb3ZlTG92ZQogICAgTG92ZUxvdmVMb3ZlTG92ZQogICAgICBMb3ZlTG92ZUxvdmUKICAgICAgICAgIExvdmUK=" | base64 -d
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

注意:base64 -d == 从 base-64 转换为文件的原始内容。


对于较小的字符串,您可以先gzipheart 文件,然后通过base64 运行*gz 文件,例如:

$ gzip heart
    => generates file heart.gz
$ base64 heart.gz
H4sICHSiC14AA2hlYXJ0AFNQUPDJL0tVgAMQjwtCoWMubIJkSuCwAeYCDEFUYS409wIAcgvdzcYAAAA=

然后要返回图像,我们必须反向运行这些步骤:

echo "H4sICHSiC14AA2hlYXJ0AFNQUPDJL0tVgAMQjwtCoWMubIJkSuCwAeYCDEFUYS409wIAcgvdzcYAAAA=" | base64 -d | gunzip
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

【讨论】:

  • 效果很好!非常感谢您。我不能提交“有用的投票”,但我做到了。
  • 很高兴听到(“成功了”);至于错过的一票……darn……我希望用这些额外的积分来买今晚的晚餐! :-)
【解决方案2】:

背景:

有人用心脏的文字图像创建了一个文本文件;我们将文件命名为heart

然后他们(可能)使用gzip 压缩文件,例如:gzip heart 生成文件heart.gz

此时,如果您通过gunzip 运行文件并将结果转储到标准输出,您会得到:

$ gunzip -c heart.gz
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

您也可以通过cating heart.gz 然后将输出传送到gunzip 来生成相同的结果,例如:

$ cat heart.gz | gunzip
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

当前问题:

创建者(本质上)将heart.gz 转换为等效的十六进制代码字符串,而不是上传heart.gz 文件然后要求下载所述文件。这消除了上传heart.gz 文件的需要。

现在,除了通过gunzip 运行文件(heart.gz),用户可以将echo 十六进制字符串输出到标准输出(基本上生成与cat heart.gz 相同的输出),然后通过管道传输到@987654338 @,最终结果是您询问的命令应该生成有问题的图像:

$ echo '\x1f\x8b\x08\x00\x95\x10\xe0R\x02\xffSPP\xf0\xc9/KU\x80\x03\x10\x8f\x0bB\xa1c.l\x82dJ\xe0\xb0\x01\xe6\x02\x0cATa.T\xf7\x02\x00\xd9\x91g\x05\xc5\x00\x00\x00'|gunzip
   Love          Love
  LoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
LoveLoveLoveLoveLoveLove
  LoveLoveLoveLoveLove
    LoveLoveLoveLove
      LoveLoveLove
          Love

注意echo 可能无法完全正常工作,具体取决于您的 echo 版本,因此您可能需要使用 echo -e(根据 Cyrus 评论) 或将echo 替换为printf(根据其他人的回答)。

【讨论】:

    【解决方案3】:

    使用echo 获得精确的二进制输出很棘手,因为实现方式有很大差异。

    在 bash 中,您可以改为使用 printf 执行此操作(其他 shell 会有所不同,因为 \x 转义符不可移植):

    $ printf '\x1f\x8b\x08\x00\x95\x10\xe0R\x02\xffSPP\xf0\xc9/KU\x80\x03\x10\x8f\x0bB\xa1c.l\x82dJ\xe0\xb0\x01\xe6\x02\x0cATa.T\xf7\x02\x00\xd9\x91g\x05\xc5\x00\x00\x00'|gunzip
       Love          Love
      LoveLoveLoveLoveLove
    LoveLoveLoveLoveLoveLove
    LoveLoveLoveLoveLoveLove
    LoveLoveLoveLoveLoveLove
      LoveLoveLoveLoveLove
        LoveLoveLoveLove
          LoveLoveLove
              Love$ 
    

    注意压缩后的内容不是换行终止的,所以心脏上方会出现下一个提示。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2022-01-04
      • 2015-08-06
      相关资源
      最近更新 更多