如何在bash shell中将一个字符串拆分成多个变量?
如何在bash shell中将一个字符串拆分成多个变量?
这个问题在这里已经有答案了:
我一直在寻找解决方案,找到了类似的问题,只是它们试图用空格将句子分开,并且答案不适用于我的情况。
当前正在将变量设置为以下字符串:
ABCDE-123456
我想将其拆分为2个变量,并消除\"-\"。 例如:
var1=ABCDE
var2=123456
如何实现这一点?
这是对我有用的解决方案:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)
是否可能使用cut命令而不需要分隔符(每个字符都被设置为一个变量)?
var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
等等。
admin 更改状态以发布 2023年5月21日
如果你知道只有两个字段,你可以像这样跳过额外的子进程,使用::
var1=${STR%-*} var2=${STR#*-}
这是干什么的?${STR%-*}
删除$STR
字符串的从结尾开始的最短匹配-*
的子字符串。${STR#*-}
也是一样,但是是使用*-
模式从字符串的开头开始。它们每个都有相对应的%%
和##
寻找最长的锚定模式匹配。如果有人有一个有用的记忆口诀来记住哪个做什么,请告诉我!我总是要尝试两个才能记住。
有关更多信息,请参见Bash文档。
要分割一个由-
分隔的字符串,可以使用read
和IFS
:
$ IFS=- read -r var1 var2 <<< ABCDE-123456 $ echo "$var1" ABCDE $ echo "$var2" 123456
编辑:
以下是如何将每个单独的字符读入数组元素:
$ read -ra foo <<<"$(echo "ABCDE-123456" | sed 's/./& /g')"
将数组进行转储:
$ declare -p foo declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]="-" [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'
如果字符串中有空格:
$ IFS=$'\v' read -ra foo <<<"$(echo "ABCDE 123456" | sed $'s/./&\v/g')" $ declare -p foo declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]=" " [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'