如何从文件执行字符串块

如何从文件执行字符串块

我已将以下命令保存在 mat.txt 文件中:

printf "
       _       ____            __ _
 _ __ (_)_  __/ ___|_ __ __ _ / _| |_
| '_ \| \ \/ / |   | '__/ _` | |_| __|
| | | | |>  <| |___| | | (_| |  _| |_
|_| |_|_/_/\_\\____|_|  \__,_|_|  \__|


"

当我使用以下命令使该文件可执行后执行它时:

chmod +x mat.txt

它给了我一个错误:

在此处输入图片描述

它说的是找不到命令,搜索'&语法错误时到达文件末尾。

有人知道为什么吗?

答案1

man bash

将字符括在双引号中会保留引号内所有字符的文字值,但 $、`、 和启用历史记录扩展时的 ! 除外。

换句话说," ... "不足以保护文本第 4 行的不平衡反引号;shell 将其解释为命令替换的开始。

另一方面,您不能使用单引号,因为您的文本包含单引号。

我建议完全避免引用的问题,使用这里的文件。您还应该使用 shebang 来确保您的文件被目标 shell 解释。所以:

#!/bin/sh

cat <<'TXT'
       _       ____            __ _
 _ __ (_)_  __/ ___|_ __ __ _ / _| |_
| '_ \| \ \/ / |   | '__/ _` | |_| __|
| | | | |>  <| |___| | | (_| |  _| |_
|_| |_|_/_/\_\\____|_|  \__,_|_|  \__|


TXT

然后

$ ./mat.txt
       _       ____            __ _
 _ __ (_)_  __/ ___|_ __ __ _ / _| |_
| '_ \| \ \/ / |   | '__/ _` | |_| __|
| | | | |>  <| |___| | | (_| |  _| |_
|_| |_|_/_/\_\\____|_|  \__,_|_|  \__|

答案2

你的问题中没有要求特定的翻译。因此,Python允许使用三重引号(单引号''' ... '''或双引号)将多行字符串分配给变量""" ... """)可能是这样的选择:

#!/bin/python3

a = '''
       _       ____            __ _
 _ __ (_)_  __/ ___|_ __ __ _ / _| |_
| '_ \| \ \/ / |   | '__/ _` | |_| __|
| | | | |>  <| |___| | | (_| |  _| |_
|_| |_|_/_/\_\\____|_|  \__,_|_|  \__|
'''

print(a)

执行如下:

$ ./mat.txt 

       _       ____            __ _
 _ __ (_)_  __/ ___|_ __ __ _ / _| |_
| '_ \| \ \/ / |   | '__/ _` | |_| __|
| | | | |>  <| |___| | | (_| |  _| |_
|_| |_|_/_/\_\____|_|  \__,_|_|  \__|

相关内容