foo()
{
mapfile -t arr <<< "${1}"
for i in "${!arr[@]}"
do
if [ -z "${arr[$i]}" ]
then
unset arr[$i]
fi
done
}
当我传递一个包含一些内容的变量(基本上是一个大字符串)时,我想:
示例(紧凑性不包括空行)
google https://www.google.com
yahoo https://www.yahoo.com
microsoft https://www.microsoft.com
数组应该看起来像
[ google ] == https://www.google.com
[ yahoo ] == https://www.yahoo.com
[ microsoft ] == https://www.microsoft.com
我没有在bash手册中找到任何关于2点的好解决方案,你看到的函数foo
是一种创建数组的hack,只有在它经过整个数组之后删除字符串为空的条目。
所以第2点得到一个解决方案,可能效率很低,但是它可以工作,但是第1点仍然没有一个好的解决方案,另一个解决方案就是在用read
进行迭代时创建一个数组,据我所知。
你知道如何改善这个吗?
答案 0 :(得分:1)
mapfile
不会构建关联数组(尽管如果可行,#2最简单的解决方案就是简单地过滤输入,例如grep
:mapfile -t arr < <(echo "$1" | grep -v "^$")
使用read
回退到显式循环,使用=~
运算符匹配并跳过空行。
declare -A arr
while read key value; do
if [[ $value =~ "^\s*$" ]]; then # Or your favorite regex for skipping blank lines
continue
fi
arr["$key"]="$value"
done <<< "$1"
即使使用while循环,您也可以使用grep
跳过空行:
declare -A arr
while read key value; do
arr["$key"]="$value"
done < <(echo "$1" | grep '^\s*$')