цикл while отображает переменную, пока не станет пустым в Bash - PullRequest
0 голосов
/ 28 октября 2019

Вот что мы имеем в переменной $foo:

abc bcd cde def

Нам нужно ТОЛЬКО отобразить первую часть переменной и повторять до тех пор, пока ничего не останется.

Пример:

$ magic_while_code_here
I am on abc
I am on bcd
I am on cde
I am on def

Сначала будет использовано начальное слово, а затем оно будет удалено из переменной. Сначала используйте начальное слово и т. Д. До тех пор, пока оно не станет пустым, а затем закроется.

Таким образом, переменная будет abc bcd cde def, затем bcd cde def, затем cde def и т. Д.

Мы быпокажите, что мы пробовали, но мы не уверены, с чего начать.

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Если вам нужно использовать цикл while и вырезать части из начала строки, вы можете использовать команду cut.

foo="abc bcd cde def"

while :
do
  p1=`cut -f1 -d" " <<<"$foo"`
  echo "I am on $p1"
  foo=`cut -f2- -d" " <<<"$foo"`
  if [ "$p1" == "$foo" ]; then
    break
  fi
done

Это выдаст:

I am on abc
I am on bcd
I am on cde
I am on def
1 голос
/ 28 октября 2019

Я бы использовал read -a, чтобы прочитать строку в массив, а затем распечатать ее:

$ foo='abc bcd cde def'
$ read -ra arr <<< "$foo"
$ printf 'I am on %s\n' "${arr[@]}"
I am on abc
I am on bcd
I am on cde
I am on def

Опция -r гарантирует, что обратные слеши в $foo не будут интерпретироваться;read -a позволяет вам иметь любые символы в $foo и разделять их на пробелы.


В качестве альтернативы, если вы можете использовать awk, вы можете зациклить все поля следующим образом:

awk '{for (i=1; i<=NF; ++i) {print "I am on", $i}}' <<< "$foo"
1 голос
/ 28 октября 2019

Предполагая, что переменная состоит из последовательностей только буквенных символов, разделенных пробелами, символами табуляции или переводами строки, мы можем (ab-) использовать расширение для разделения слов и просто выполнить команду printf:

foo="abc bcd cde def"
printf "I am on %s\n" $foo

. :

I am on abc
I am on bcd
I am on cde
I am on def
...