Как разделить одну строку на несколько переменных в оболочке bash? [дубликат]
этот вопрос уже есть ответ здесь:
Я искал решение и нашел похожие вопросы, только они пытались разделить предложения с пробелами между ними, и ответы не работает для меня ситуация.
в настоящее время переменная устанавливается на что-то вроде строки:ABCDE-123456
и я хотел бы разделить это на 2 переменные, устраняя " -". т. е.:var1=ABCDEvar2=123456
Как это возможно, чтобы достичь этого?
это решение, которое сработало для меня:var1=$(echo $STR | cut -f1 -d-)var2=$(echo $STR | cut -f2 -d-)
можно ли использовать вырезать команда, которая будет работать без разделителя (каждый символ устанавливается как переменная)?
var1=$(echo $STR | cut -f1 -d?)var2=$(echo $STR | cut -f1 -d?)var3=$(echo $STR | cut -f1 -d?)etc.
6 ответов:
Если ваше решение не должно быть общим, т. е. должно работать только для строк, подобных вашему примеру, вы можете сделать:
var1=$(echo $STR | cut -f1 -d-) var2=$(echo $STR | cut -f2 -d-)Я выбрал
cutздесь, потому что вы можете просто расширить код для еще нескольких переменных...
readСIFSидеально подходит для этого:$ IFS=- read var1 var2 <<< ABCDE-123456 $ echo "$var1" ABCDE $ echo "$var2" 123456Edit:
вот как вы можете прочитать каждый отдельный символ в элементы массива:
$ 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")'если в строке есть пробелы:
$ 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")'
если вы знаете, что это будет только два поля, вы можете пропустить дополнительные подпроцессы следующим образом:
var1=${STR%-*} var2=${STR#*-}что это значит?
${STR%-*}удаляет самые короткие строки$STRэто соответствует шаблону-*начиная с конца строки.${STR#*-}делает то же самое, но с*-шаблон и начиная с начала строки. У каждого из них есть двойники%%и##где найти длинной якорный шаблон матч. Если кто-нибудь имеет полезную мнемонику, чтобы помнить, что делает, дайте мне знать! Я всегда стараюсь помнить и то и другое.
звучит как работа для
setс пользовательскимIFS.IFS=- set $STR var1= var2=(вы хотите сделать это в функции с
local IFSТак что вы не испортите другие части вашего скрипта, где вы требуетеIFSчтобы быть тем, что вы ожидаете.)
используя возможности регулярных выражений bash:
re="^([^-]+)-(.*)$" [[ "ABCDE-123456" =~ $re ]] && var1="${BASH_REMATCH[1]}" && var2="${BASH_REMATCH[2]}" echo $var1 echo $var2выход
ABCDE 123456
string="ABCDE-123456" IFS=- # use "local IFS=-" inside the function set $string echo # >>> ABCDE echo # >>> 123456
Comments