如何在不使用外部命令的情况下遍历 unix shell 中的字符串字符?

How to iterate through string characters in unix shell without using external commands?

这不是 bash。这是嘘。 ${foo:0:1} 不起作用。导致替换错误。

foo="Hello"

如何单独打印每个字符?我正在寻找一种不需要外部命令的方法。

扩展我的评论:传统的 Bourne shell 确实没有更现代的 shell 中可用的那种 built-in 字符串操作功能。 预期您将依赖外部程序来实现这些功能。

例如,使用像 cut 这样简单的东西,我们可以写成:

foo="hello"

len=$(echo "$foo" | wc -c)
i=1

while [ "$i" -lt "${len}" ]; do
  echo "$foo" | cut -c"$i"
  i=$(( i + 1 ))
done

这将输出:

h
e
l
l
o

cut 这样的命令是“标准”shell 脚本命令,尽管没有内置到 shell 本身。

larsks's 中所述,您必须依赖外部命令。

我建议使用单个 awk 调用,而不是 运行 外部程序一次获取字符串长度并为每个索引重复一次。

foo="hello world"

awk -v "s=$foo" 'BEGIN { l=length(s); for(i=1; i<=l; i++) print substr(s,i,1)}' /dev/null

打印

h
e
l
l
o

w
o
r
l
d

当然,您可以向 awk 脚本添加进一步的处理,或者像

一样读取和处理输出
awk ... | while IFS= read -r char
...

https://mywiki.wooledge.org/BashFAQ/001

建议awk:

awk '{for(i=1;i<=NF;i++)print $i}' FS="" <<<$(echo "$foo")

建议bash

#!/bin/bash
foo="hello me"
for ((i = 0 ; i < ${#foo}; i++)); do
  echo "${foo:$i:1}"
done