如何将一个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