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