Как изменить переменные

У меня есть следующая переменная:

col=1,3,4, 

Нужно ли в любом случае выбирать числа внутри переменной: (т. Е. 1 3 4 и работать с ними?

Например, выбирая столбец «1», «3» или «4» из .txt файла?

Нужно ли все-таки выбирать номера переменной: 1 3 4 и работать с ними?

 $ col=1,3,4,; IFS=","; for i in $col; do echo "i= $i"; done i= 1 i= 3 i= 4 

Но изменение внутреннего разделителя полей ( IFS ) может быть опасным как его общесистемная переменная, и многие приложения полагаются на свое значение по умолчанию. Поэтому рекомендуется сохранять и восстанавливать исходное значение каждый раз, когда вам нужно его модифицировать.

 $ col=1,3,4, $ OLDIFS=$IFS $ IFS=","; for i in $col; do echo "i= $i"; done i= 1 i= 3 i= 4 $ IFS=$OLDIFS 

Вы можете использовать магию read :

 i=1,2,3,; echo $i | { IFS=","; read abc; echo "$a|$b|$c"; } i=1,2,3,; read abc <<<$(IFS=","; echo $i); echo "$a|$b|$c" i=1,2,3,; echo $i | { while read -d\, j; do echo $j; done; } 

Вы можете настроить список как переменную массива.

 #!/bin/bash col=1,3,4 declare -a colArray=($(echo $col | tr ',' ' ')) echo ${#colArray[@]} # number of elements in the array echo ${colArray[0]} # first element of the array for i in $(seq 0 $((${#colArray[@]}-1))) # loop through the array do echo ${colArray[$i]} done 

Прокрутка через может быть сделано несколькими разными способами, я только что выбрал один. Гораздо безопаснее, чем возиться с IFS.

Учитывая, что $col – это просто строка, вам нужно только преобразовать эти запятые ( , ) в пробелы, и вы сможете использовать цикл, например, for итерации через них.

Вот 2 метода, используя sed в 1-м, и объект поиска и замены в Bash:

 $ echo $col | sed 's/,/ /g' 1 3 4 $ echo ${col//,/ } 1 3 4 

Если вы выборочно хотите одно из значений, вы можете использовать cut :

 $ echo $col | cut -d"," -f1 1 $ echo $col | cut -d"," -f2 3 $ echo $col | cut -d"," -f3 4 

пример

Вот решение sed с циклом, когда мы «ходим» через значения $col .

 $ for i in $(echo $col | sed 's/,/ /g'); do echo $i; done 1 3 4 

Каждый раз через цикл мы могли бы помещать значения $col в другую переменную или делать то, что вам нужно делать, когда вы перебираете $col .

 for i in $(echo $col | sed 's/,/ /g'); do ...use $i in here... done 

Изменение внутреннего разделителя полей (IFS) может быть опасным, поскольку оно является общесистемной переменной, и многие приложения полагаются на свое значение по умолчанию. Поэтому рекомендуется сохранять и восстанавливать исходное значение каждый раз, когда вам нужно его модифицировать.

Пример с использованием предыдущего предложения:

 #!/bin/bash col=1,3,4, OLD_IFS=$IFS IFS="," for i in $col; do echo "i= $i" done IFS=$OLD_IFS