将变量传递给 ascii 艺术

pass a variable into a ascii art

在bash/Ubuntu,

如果有ASCII艺术文件:"ascii-art"在下面

 |__   __|  ____|/ ____|__   __|
    | |  | |__  | (___    | |   
    | |  |  __|  \___ \   | |   
    | |  | |____ ____) |  | |   
    |_|  |______|_____/   |_|   Client ${CLIENT_ID}

有没有办法在每次调用时将变量“${CLIENT_ID}”传递给ascii-art?

我们目前的称呼方式:

cat ascii-art

以下方式无效

1.  cat ascii-art | CLIENT_ID="1"

  1. 在文件的第一行再添加一行"ascii-art"
. command_line_parse.sh -c ${CLIENT_ID}

 |__   __|  ____|/ ____|__   __|
    | |  | |__  | (___    | |   
    | |  |  __|  \___ \   | |   
    | |  | |____ ____) |  | |   
    |_|  |______|_____/   |_|   Client ${CLIENT_ID}

然后

cat ascii-art | CLIENT_ID="1"

有哪位大神能开导一下吗?谢谢。

首先:查看程序 figlettoiletcowasy。这些大概是你想要的实现完成了。

如果要自己写:

sed 's/${CLIENT_ID}/42/g' ascii-art

下面计算文件内容的 echo 命令:

CLIENT_ID=1000 eval "$(cat <<EOC
echo -e "$(<ascii-art)"
EOC
)"
  • CLIENT_ID=1000eval 命令分配环境变量
  • eval 接受此处文档作为其单个参数
  • $(<ascii-art),在 Bash 中,作用与 $(cat ascii-art)
  • 相同

编辑关于可怕的 eval

我们确实应该避免使用 eval。但我们也应该明白 命令的目的,并在适当的时候使用它。我们应该明白 安全风险,并决定我们是否应该使用 eval 在某些情况下。

Bash Hackers Wiki描述的很好 共 eval 个:

Perhaps the easiest way to think about eval is that it works in the same way as running bash -c "bash code…" from a script, except in the case of eval, the given code is executed in the current shell environment rather than a child process.

所以eval只是执行我们传递的shell代码。我们多久执行一次 Bash 脚本的外部命令?我想,经常。和命令 只是受信任的可执行文件,它们很可能是 Bash 脚本本身。

那为什么要害怕评估一些 echo "trusted content"

由用户 (OP) 决定在某些情况下使用 eval 是否安全 情况。但是,这个答案肯定给了他一个选择;它是一个 替代解决方案。所以我不明白这个答案的反对票。

根据以上 RotatingPieces 的回答修改

先修改"ascii-art"文件,把"${CLIENT_ID}"改成"CLIENT_ID_ART"

 |__   __|  ____|/ ____|__   __|
    | |  | |__  | (___    | |   
    | |  |  __|  \___ \   | |   
    | |  | |____ ____) |  | |   
    |_|  |______|_____/   |_|   Client CLIENT_ID_ART

下面的方法可能不是很优雅,但效果很好

CLIENT_ID="1" # The ${CLIENT_ID} will actually be from the command line parser

echo "sed 's/CLIENT_ID_ART/"${CLIENT_ID}"/g' ascii-art > call_art

chmod +x call_art

./call_art &

rm -f call_art

上面会在输出中打印出如下内容

 |__   __|  ____|/ ____|__   __|
    | |  | |__  | (___    | |   
    | |  |  __|  \___ \   | |   
    | |  | |____ ____) |  | |   
    |_|  |______|_____/   |_|   Client 1

envsubst 工具正是为此目的而编写的:

CLIENT_ID=foo envsubst ascii-art

这是比 sed 更可取的工具,它限制了可能值的范围(如果您的 ID 中有一个 /,或者更糟的是一个分号后跟另一个 sed 命令,可能会出现严重的错误)。


另请参阅 Wooledge wiki 上的 TemplateFiles,其中包括针对没有 GNU gettext 的系统(包括 envsubst)的原生 bash 实现。