gpt4 book ai didi

bash 本地化不适用于多行字符串(具有强语法或通过 `eval` )

转载 作者:行者123 更新时间:2023-11-29 08:49:28 25 4
gpt4 key购买 nike

bash 中有一个很好的特性,关于本地化(语言翻译):

TEXTDOMAIN=coreutils
LANG=fr_CH.utf8
echo $"system boot"
démarrage système

(注意对于这项工作,fr_CH.utf8 已经在您的系统上生成...否则您可以尝试自己的语言环境...或安装 locales 并生成一个。)

问题:

但是如果这对简单的字符串工作正常,当字符串包含 \n(或者最糟糕的是:反引号 ` 时,事情就更复杂了:

echo $"Written by %s, %s, %s,\nand %s.\n"
Written by %s, %s, %s,\nand %s.\n

这不是有人参与的回答。

(Nota2:对于这项工作,必须在 .mo 消息文件中准备准确的消息,在这个示例/测试中,我使用现有的 coreutils.mo 文件,可以使用 msgunfmt 命令未格式化。)

总而言之,我发现进行翻译的唯一方法是:

eval echo \$\"$'Written by %s, %s, %s,\nand %s.\n'\"
Écrit par %s, %s, %s,
et %s.

msg=$'Written by %s, %s, %s,\nand %s.\n'
eval echo \$\""$msg"\"
Écrit par %s, %s, %s,
et %s.

(你可以看到两个双引号……不是很性感……)

最后我可以:

WRITTERS=(Hans Pierre Jackob Heliott)
eval printf \$\""$msg"\" ${WRITTERS[@]}
Écrit par Hans, Pierre, Jackob,
et Heliott.

但正如我最近听说的那样,eval 是邪恶的... ;-)

事实上,我对使用仅硬编码部分 运行的eval 没有问题,但我希望有一种方法可以将此 eval 排除在外并以更自然可读的方式编写此类部分。

@techno 的回答让我明白我的第一个想法是危险的,好像WRITTERS 包含一些;ls,因为 sample ...

编辑: 所以问题是:

我怎样才能将这个eval 排除在外和/或以更性感的方式编写它

备注:

$ printf "I use bash %s on Debian %s\n" $BASH_VERSION $(</etc/debian_version)
I use bash 4.1.5(1)-release on Debian 6.0.6

最佳答案

我玩过这个功能,这就是我想出的:你可以逐字包括换行符:

$ echo $"Written by %s.
> "
Écrit par %s.
$

在脚本中:

#!/bin/bash

message=$"Written by %s.
"

printf "$message" Gniourf

此脚本将输出:

Écrit par Gniourf.

好吧,这不是一个真正的答案,但它可能会有一点帮助(至少,我们没有使用邪恶的 eval)。

个人评论:我觉得这个功能真的很笨拙!

关于bash 本地化不适用于多行字符串(具有强语法或通过 `eval` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com