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

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

col=1,3,4, 

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

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

5 Solutions collect form web for “Как изменить переменные”

Нужно ли все-таки выбирать номера переменной: 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 
  • Как назначить вывод команды переменной без запуска команды в подоболочке?
  • Могу ли я определить тип переменной awk?
  • Как выбрать количество цифр в переменной в моих сценариях?
  • Shell: как использовать 2 переменные с условием
  • Развертывание Jenkins не передается переменной java
  • Область переменных в while-read-loop на Solaris
  • Несколько входов в одной команде
  • Каков наиболее эффективный способ grep для двух совершенно разных вещей и присвоения значений отдельным переменным?
  • Удалить определенное слово в переменной
  • bash - определяющие переменные с VAR = $ {: - по умолчанию}
  • захватить из текстового файла диапазон с использованием двух переменных в качестве начального и конечного параметров
  • Interesting Posts

    Изменить элементарное имя хоста os?

    Невозможно удалить мост – «мост br0 все еще работает; не может удалить его "

    загрузить файл / резервное копирование с удаленного сервера на рабочий стол без SSH или SCP?

    Никакой синтаксической раскраски в vim для меня, но нормально для моих учеников

    Что означает longterm на kernel.org?

    Риски, связанные с lazy_itable_init = 1 для ext4 fs на SD-карте

    Как удалить строки, соответствующие foo, но не соответствующие строке?

    Как установить постоянную низкую яркость в меню grub2?

    Случайное удаление каталога / lib в Fedora 15

    IBM DB2 для Linux AMD64 не устанавливается на Debian Jessie, журнал установки предлагает проблему с поставляемым IBM libdb2ure.so

    Как сделать самодельный bash_profile, распознанный терминалом?

    Переменные назначения влияют на текущую рабочую оболочку

    on osx vim 7.3 set number set relative number not working

    Получено меньше вывода с параметром print0 для поиска?

    Автоматически убивать сеанс tmux

    Linux и Unix - лучшая ОС в мире.