我想将三个字母分成WER
三个独立的字母。如下:
W = array[0]
E = array[1]
R = array[2]
我尝试了命令
WER | cut -c1
但我无法将新字符串保存W
在变量中。
我试过
set var1 = WER | cut -c1
但它不起作用。
答案1
在bash
:
str=WER
a=( "${str:0:1}" "${str:1:1}" "${str:2:1}" )
或者,作为任意长字符串的循环:
str=WER
a=()
for (( i = 0; i < ${#str}; ++i )); do
a+=( "${str:i:1}" )
done
${parameter:offset:length}
是一个bash
子串扩展这将得出从 offset 开始length
的字符串的字符数。$parameter
offset
答案2
使用以下方法更容易zsh
:
string=WER
array=(${(s::)string})
printf '<%s>\n' $array
(请注意,像大多数其他 shell 一样,数组索引zsh
从 1 开始,而不是像bash
/那样从 0 开始ksh
)。
或者使用fish
(数组也从 1 开始):
set string WER
set array (string split '' $string)
printf '<%s>\n' $array
(假设$string
不包含换行符)。
POSIXly(POSIX shell 有一个数组:($@
也从 1: 开始$1
)),因此也可以在bash
orzsh
和您系统的标准中工作sh
:
string=WER
set --
while [ -n "$string" ]; do
tmp=${string#?}
set -- "$@" "${string%%"$tmp"}"
string=$tmp
done
printf '<%s>\n' "$@"
与csh
或tcsh
您似乎正在使用的:
set string = WER
set array = "`printf '%s\n' $string:q | fold -w1`"
printf '<%s>\n' $array:q
与 for 一样fish
,它也假设字符串不包含换行符。另请注意,某些fold
实现将按字节而不是字符折叠,这意味着如果字符串包含多字节字符,它将无法正常工作。