如何将一个string拆分成bash shell中的多个variables?

我一直在寻找一个解决scheme,并发现类似的问题,只是他们试图拆分与他们之间的空格句子,答案不适合我的情况。

目前一个variables被设置为这样一个string:
ABCDE-123456
我想分解成2个variables,同时消除“ ”。 即:
var1=ABCDE
var2=123456

怎么可能做到这一点?


这是为我工作的解决scheme:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

是否有可能使用不带分隔符的剪切命令(每个字符都被设置为variables)?

var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
etc.

如果你的解决scheme不一定是一般的,即只需要像你的例子那样工作,你可以这样做:

 var1=$(echo $STR | cut -f1 -d-) var2=$(echo $STR | cut -f2 -d-) 

我select在这里cut ,因为你可以简单地扩展一些variables的代码…

read IFS是完美的:

 $ IFS=- read var1 var2 <<< ABCDE-123456 $ echo "$var1" ABCDE $ echo "$var2" 123456 

编辑:

以下是如何将每个单独的字符读入数组元素:

 $ read -a 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")' 

如果string中有空格:

 $ IFS=$'\v' read -a 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")' 

如果你知道这将只是两个字段,你可以跳过这样的额外的subprocess:

 var1=${STR%-*} var2=${STR#*-} 

这是做什么的? ${STR%-*}删除$STR的最短子string,匹配来自string末尾的模式-*${STR#*-}也是一样的,但有*-模式,从string的开头开始。 他们每个都有对应的%%##find最长的锚定模式匹配。 如果任何人有一个有用的记忆,记住哪个做的,让我知道! 我总是要尝试两个记忆。

听起来像一个自定义IFS set的工作。

 IFS=- set $STR var1=$1 var2=$2 

(你会想在一个带有local IFS的函数中做到这一点,所以你不要把脚本的其他部分搞乱,因为你需要的是IFS

使用bash正则expression式function:

 re="^([^-]+)-(.*)$" [[ "ABCDE-123456" =~ $re ]] && var1="${BASH_REMATCH[1]}" && var2="${BASH_REMATCH[2]}" echo $var1 echo $var2 

OUTPUT

 ABCDE 123456 
 string="ABCDE-123456" IFS=- # use "local IFS=-" inside the function set $string echo $1 # >>> ABCDE echo $2 # >>> 123456