小编Ben*_*son的帖子

在脚本中设置“LANG=C LC_ALL=C”对 printf 中非英文字符的填充长度没有影响

我正在将 Bash 脚本的输出格式化为表格,以便用于表示每列边界的管道字符相对于该列中最长的字符串间隔开(从而很好地排列所有管道字符)。

下面是相关的输出位。请注意“il2”和“ksp”行的两个管道字符如何对齐,但是在包含非英文字符“ý”的“iceland”行中,第二个管道字符向左缩进一个空格到其他行。

iceland          | Mýrdalssandur Iceland                    | steam://rungameid/1248990                                                                   | iceland-Win64-Shipping.exe
il2              | IL 2 Sturmovik: 1946                      | steam://rungameid/15320                                                                     | il2fb.exe
ksp              | Kerbal Space Program                      | steam://rungameid/220200                                                                    | KSP_x64.exe
Run Code Online (Sandbox Code Playgroud)

在脚本的最开始,我有以下内容:

oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
Run Code Online (Sandbox Code Playgroud)

最后,就在最后的“完成”声明之前,我有:

LANG=$oLang LC_ALL=$oLcAll
Run Code Online (Sandbox Code Playgroud)

整个脚本中没有其他语言设置更改。

如果在 shell 中我将一个$string变量设置为 "Mýrdalssandur Iceland" 并运行printf "%-14s is %2d char length\n" "'$string'" ${#string},我得到的字符长度为 21,但是当我运行LANG=C LC_ALL=C和 then 时printf "%-14s is %2d char length\n" "'$string'" ${#string},我得到的字符长度为 22,这表明它实际上应该有所作为。

我创建了一个准系统脚本来测试填充,在该脚本中,更改LANG确实具有预期的效果,即使这些printf行包含在函数中,就像它们在相关的主脚本中一样。

在这一点上,我不知道为什么输出没有应用语言更改,因此感谢任何帮助。

这是完整的脚本: …

linux language bash text-formatting

6
推荐指数
1
解决办法
667
查看次数

ZSH 迭代包含空格的字符串数组

我正在尝试编写一个 ZSH 脚本,它将迭代一系列包含空格的字符串。

首先,我将set -A数组:

set -A a "this is" "a test" "of the" "emergency broadcast system"

从这里开始,我将尝试使用基本循环对其进行迭代for,确保将数组用引号括起来以处理空格:

for i in "$a"; do echo "${a[$i]}"

但是,这会引发以下错误:

zsh: bad math expression: operator expected at `is a test ...'

我已经玩了一段时间,甚至尝试将分隔符设置为“\n”,因为我认为问题是数组使用空格作为分隔符,但甚至这样做:

a=(IFS=$'\n';"this is" "a test" "of the" "emergency broadcast system")

其次是:

for i in "$a"; do echo "${a[$i]}"; done

产生相同的 ZSH 错误。

zsh array string

5
推荐指数
1
解决办法
2402
查看次数

标签 统计

array ×1

bash ×1

language ×1

linux ×1

string ×1

text-formatting ×1

zsh ×1