将变量传递给 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"
或
- 在文件的第一行再添加一行"ascii-art"
. command_line_parse.sh -c ${CLIENT_ID}
|__ __| ____|/ ____|__ __|
| | | |__ | (___ | |
| | | __| \___ \ | |
| | | |____ ____) | | |
|_| |______|_____/ |_| Client ${CLIENT_ID}
然后
cat ascii-art | CLIENT_ID="1"
有哪位大神能开导一下吗?谢谢。
首先:查看程序 figlet
、toilet
或 cowasy
。这些大概是你想要的实现完成了。
如果要自己写:
sed 's/${CLIENT_ID}/42/g' ascii-art
下面计算文件内容的 echo
命令:
CLIENT_ID=1000 eval "$(cat <<EOC
echo -e "$(<ascii-art)"
EOC
)"
CLIENT_ID=1000
为 eval
命令分配环境变量
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 实现。
在bash/Ubuntu,
如果有ASCII艺术文件:"ascii-art"在下面
|__ __| ____|/ ____|__ __|
| | | |__ | (___ | |
| | | __| \___ \ | |
| | | |____ ____) | | |
|_| |______|_____/ |_| Client ${CLIENT_ID}
有没有办法在每次调用时将变量“${CLIENT_ID}”传递给ascii-art?
我们目前的称呼方式:
cat ascii-art
以下方式无效
1. cat ascii-art | CLIENT_ID="1"
或
- 在文件的第一行再添加一行"ascii-art"
. command_line_parse.sh -c ${CLIENT_ID} |__ __| ____|/ ____|__ __| | | | |__ | (___ | | | | | __| \___ \ | | | | | |____ ____) | | | |_| |______|_____/ |_| Client ${CLIENT_ID}
然后
cat ascii-art | CLIENT_ID="1"
有哪位大神能开导一下吗?谢谢。
首先:查看程序 figlet
、toilet
或 cowasy
。这些大概是你想要的实现完成了。
如果要自己写:
sed 's/${CLIENT_ID}/42/g' ascii-art
下面计算文件内容的 echo
命令:
CLIENT_ID=1000 eval "$(cat <<EOC
echo -e "$(<ascii-art)"
EOC
)"
CLIENT_ID=1000
为eval
命令分配环境变量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 ofeval
, 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 实现。