【发布时间】:2022-01-08 10:55:31
【问题描述】:
关于将字符串拆分成数组我们有两种情况:
如果字符串中有空格怎么做分隔符,按照下面的帖子:
所以如果我使用:
string="Hello Unix World"
array1=($string)
echo ${array1[@]}
echo "size: '${#array1[@]}'"
read -a array2 <<< $string
echo ${array2[@]}
echo "size: '${#array2[@]}'"
输出是:
Hello Unix World
size: '3'
Hello Unix World
size: '3'
两种方法都按预期工作。
现在,如果字符串有不同于空格的东西如何分隔符,根据下面的帖子:
所以如果我使用:
path="/home/human/scripts"
IFS='/' read -r -a array <<< "$path"
echo "Approach 1"
echo ${array[@]}
echo "size: '${#array[@]}'"
echo "Approach 2"
for i in "${array[@]}"; do
echo "$i"
done
echo "Approach 3"
for (( i=0; i < ${#array[@]}; ++i )); do
echo "$i: ${array[$i]}"
done
打印出来:
Approach 1
home human scripts <--- apparently all is ok, but see the line just below!
size: '4'
Approach 2
<--- an empty element
home
human
scripts
Approach 3
0: <--- confirmed, the empty element
1: home
2: human
3: scripts
为什么会出现那个空元素?如何修复命令以避免这种情况?
【问题讨论】:
-
分隔符有一个'before'字段和一个'after'字段;当
/是分隔符时 -/home/human/scripts- 有 4 个字段...第一个/之前的空字符串,以及您知道的其他 3 个字段;如果输入是//home/human/scripts/,您将有 6 个字段... 2 个空字符串 +home+human+scripts+ 1 个空字符串 -
我也应该说,如果您在方法 1 中正确引用了数组,
echo "${array[@]}"将输出 `home human scripts, with the space separating the empty string fromhome` 可见。没有引号,echo真的只得到三个参数;在分词期间未加引号的空字符串“消失”。 -
@markp-fuso 非常感谢您的解释。
-
fwiw,使用分隔符(例如,
cut和awk)或使用IFS分割输入(例如,@ 987654340@ - 见 konsolebox 的例子) -
空字符串不等于空格。
echo "${array[@]}"输出中的前导空格来自echo本身,而不是数组。
标签: arrays string bash shell split