如何在shell脚本中将字符串转换为数组

Mag*_*o C 4 bash array shell-script

我已经阅读了How to split a string into an array in bash但这个问题对我来说似乎有点不同,所以我会使用我的数据提问。

我有来自 STDIN 的这条线:

(5,[a,b,c,d,e,f,g,h,i,j])
Run Code Online (Sandbox Code Playgroud)

五个是我的组 ID,字母是数组的值(组数据)。我需要将组 ID 放入 var 并将字母放入我可以使用的东西中IFS=',' read -r -a array <<< "$tline"

αғs*_*нιη 9

bkpIFS="$IFS"

IFS=',()][' read -r -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
echo ${array[@]}    ##Or printf "%s\n" ${array[@]}
5 a b c d e f g h i j

IFS="$bkpIFS"
Run Code Online (Sandbox Code Playgroud)

说明:

  • 首先,我们正在采取的默认/当前备份壳IFS用bkpIFS="$IFS";
  • 然后我们设置IFS到集分隔符,,(,),]并[与IFS=',()]['这意味着我们的输入字符串可以划定一个或更多的这些分隔符。

  • 接下来read -r -a array读取该行并将其拆分为一个数组,该数组array仅基于从Here-String方法中传递的输入字符串中定义的 IFS调用。该-r选项用于告诉read命令\在输入时不要对反斜杠进行扩展。

    IFS=',()][' read -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j,\,k])"
    echo ${array[@]}
    5 a b c d e f g h i j ,k
    
    Run Code Online (Sandbox Code Playgroud)

    查看最后一个,k是由输入中的反斜杠引起的,read没有它的-r选项。

  • 随着echo ${array[@]}我们打印阵列中的所有元素。请参阅$* 和 $@ 之间有什么区别?和吉尔斯关于${array[@]}那里的回答有更多细节。

  • 用printf "%s\n" ${array[@]}也有其他的方法来打印数组元素。

  • 现在,您可以使用printf "%s\n" ${array[INDEX]}或相同来打印数组的特定元素echo ${array[INDEX]}。

  • 啊,对不起,忘了IFS回馈给shell,IFS="$bkpIFS":)

或使用awk及其split功能。

awk '{split($0,arr,/[][,)(]/)} 
    END{for (x in arr) printf ("%s ",arr[x]);printf "\n"}' <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
Run Code Online (Sandbox Code Playgroud)

说明:

  • 在这里,我们根据正则[...]表达式常量中定义的定界符组拆分整行输入,这些定界符/[...]/支持awkusingsplit函数的现代实现。在功能部分阅读更多内容split()。

  • 接下来,END{for (x in arr) printf ("%s ",arr[x]); ...}我们将循环调用数组arr并打印它们对应的值。x这里指向数组元素的索引arr。阅读有关awkBEGIN/END 规则的更多信息。

侧重定向到如何在 bash 中向数组添加/删除元素?.