如何在不使用外部命令的情况下遍历 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
...
建议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
这不是 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
...
建议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