【问题标题】:Concatenate strings with delimeter in for loop in shell script在shell脚本的for循环中用分隔符连接字符串
【发布时间】:2021-11-19 00:28:30
【问题描述】:

添加逗号会创建一个空格而不是附加逗号。

注意:$1 的值为s,v,h

declare -A handles
handles["s"]="test1"
handles["v"]="test2"
handles["h"]="test3"

IFS=',' list=($1)
for item in "${list[@]}"; do
        result+=",${handles["$item"]}"
done

echo -e $result

输出:test1 test2 test3

预期:test1,test2,test3

【问题讨论】:

  • @markp-fuso $1 的值为 s,v,h
  • IFS=',' list=($1) 未在其环境中设置 IFS 执行 list 分配。相反,它相当于IFS=','; list=($1);,因此充当两个分配。我认为核心问题是 echo 中缺少引号,应该是 echo -e "$result",但是将 IFS 重置为合理的值当然是个好主意。

标签: bash shell git-bash


【解决方案1】:

一个解决问题的方法是使用IFS,并消除$result 中不需要的逗号,...

$ cat script.sh
#!/usr/bin/bash

declare -A handles
handles["s"]="test1"
handles["v"]="test2"
handles["h"]="test3"
handles["a b c"]="test 4"

mapfile -t list < <(tr ',' '\n' <<< "$1")     # to handle white space in fields

unset pfx

for item in "${list[@]}"
do
    handle="${handles[$item]}"

    # only append if non-empty
    [ -n "${handle}" ] && result+="${pfx}${handle}" && pfx=','
done

echo -e "${result}"

$ script.sh 's,v,h'
test1,test2,test3

$ script.sh 'a b c,s,v,h'
test 4,test1,test2,test3

$ script.sh 'd e f,s,v,h'
test1,test2,test3

$ script.sh 'x,y,z,s,v,h,a,b,c'
test1,test2,test3

【讨论】:

    【解决方案2】:

    IFS 是问题所在:

    > x=",a" && x+=",b" && x+=",c" && echo $x
    ,a,b,c 
    > IFS="," && x=",a" && x+=",b" && x+=",c" && echo $x
     a b c
    

    只需在echo 之前添加IFS="" 或使用echo -e "$result" 即可。

    【讨论】:

    • 这是一种查看方式。从我的角度来看,未引用的 $result 是问题所在,而不是 IFS
    【解决方案3】:

    我假设您想暂时将IFS 分配给“,”而不是影响 以下代码。然后你可以将它与read 命令组合如下:

    #!/bin/bash
    
    declare -A handles=(
        ["s"]="test1"
        ["v"]="test2"
        ["h"]="test3"
    )
    
    IFS=',' read -r -a list <<< "$1"
    for item in "${list[@]}"; do
        ary+=( "${handles["$item"]}" )
    done
    
    result=$(IFS=','; echo "${ary[*]}")
    echo "$result"
    
    • for 循环将数组 ary 分配给关联数组 handles 的值,该数组由 list 的元素键控。
    • 命令echo "${ary[*]}" 将数组ary 与分隔符, 连接起来。它在子shell中执行,无需在前台进程中修改IFS

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多