将变量传递给ascii艺术

时间:2016-09-29 19:51:53

标签: bash cat

在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”
  2. 的第一行再添加一行
    . command_line_parse.sh -c ${CLIENT_ID}
    
     |__   __|  ____|/ ____|__   __|
        | |  | |__  | (___    | |   
        | |  |  __|  \___ \   | |   
        | |  | |____ ____) |  | |   
        |_|  |______|_____/   |_|   Client ${CLIENT_ID}
    

    然后

    cat ascii-art | CLIENT_ID="1"
    

    任何一位大师能开导吗?感谢。

4 个答案:

答案 0 :(得分:2)

envsubst工具就是为了这个目的而编写的:

CLIENT_ID=foo envsubst ascii-art

这是sed的首选工具,它限制了可能值的范围(如果您的ID中有/,或者更糟糕的是分号后跟另一个sed命令,严重的错误可能随之而来)。

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

答案 1 :(得分:1)

以下评估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

  

考虑eval的最简单方法可能就是它以同样的方式工作   从脚本运行bash -c "bash code…",除非是   eval,给定的代码在当前的shell环境中执行   而不是一个孩子的过程。

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

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

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

答案 2 :(得分:0)

首先:查看计划figlettoiletcowasy。这些可能已经完成了你想要的实现。

如果你想自己写一下:

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

答案 3 :(得分:0)

从RotatingPieces&#39;修改回答上面

首先修改&#34; ascii-art&#34;文件,并更改&#34; $ {CLIENT_ID}&#34;进入&#34; CLIENT_ID_ART&#34;

 |__   __|  ____|/ ____|__   __|
    | |  | |__  | (___    | |   
    | |  |  __|  \___ \   | |   
    | |  | |____ ____) |  | |   
    |_|  |______|_____/   |_|   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