Как я могу читать пользовательский ввод как массив в Bash?

Нет. Посмотрите здесь, почему. Хотя он делает больше, чем вам нужно, rsync имеет один параметр --progress.

rsync -ah --progress source destination

Результат будет выглядеть примерно так:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)
10
задан 6 March 2011 в 12:07

30 ответов

Вот один из способов сделать это:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 25 May 2018 в 22:41
  • 1
    read -r очень полезно / важно иногда ... Ссылка Стефано на «читать встроенную справочную страницу» объясняет его цель ... (для предотвращения интерпретации обратной косой черты). – Peter.O 9 March 2011 в 09:04

Вот один из способов сделать это:

while read line do my_array=("${my_array[@]}" $line) done echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 25 July 2018 в 22:24

Вот один из способов сделать это:

while read line do my_array=("${my_array[@]}" $line) done echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 26 July 2018 в 21:11

Вот один из способов сделать это:

while read line do my_array=("${my_array[@]}" $line) done echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 31 July 2018 в 10:59

Вот один из способов сделать это:

while read line do my_array=("${my_array[@]}" $line) done echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 2 August 2018 в 03:50

Вот один из способов сделать это:

while read line do my_array=("${my_array[@]}" $line) done echo ${my_array[@]}

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода, пока не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element.

Некоторые интересные фрагменты документации:

В расширенном руководстве по созданию сценариев Bash есть отличная глава о массивах. Манипуляция прочитанных встроенных примеров массивов из массива thegeekstuff.com
8
ответ дан 4 August 2018 в 19:54

Вот один из способов сделать это:

  во время чтения строки do my_array = ("$ {my_array [@]}" $ line) done echo $ {my_array [@]}  

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода до тех пор, пока вы не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array . Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element .

Некоторые интересные фрагменты документации:

8
ответ дан 6 August 2018 в 03:57

Вот один из способов сделать это:

  во время чтения строки do my_array = ("$ {my_array [@]}" $ line) done echo $ {my_array [@]}  

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода до тех пор, пока вы не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array . Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element .

Некоторые интересные фрагменты документации:

8
ответ дан 7 August 2018 в 21:54

Вот один из способов сделать это:

  во время чтения строки do my_array = ("$ {my_array [@]}" $ line) done echo $ {my_array [@]}  

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода до тех пор, пока вы не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array . Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element .

Некоторые интересные фрагменты документации:

8
ответ дан 10 August 2018 в 10:09

Вот один из способов сделать это:

  во время чтения строки do my_array = ("$ {my_array [@]}" $ line) done echo $ {my_array [@]}  

Если вы просто запустите его, он будет продолжать чтение со стандартного ввода до тех пор, пока вы не нажмете Ctrl + D (EOF). После этого строки, которые вы ввели, будут находиться в my_array . Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element .

Некоторые интересные фрагменты документации:

8
ответ дан 13 August 2018 в 16:30
  • 1
    read -r иногда очень полезно / важно ... Ссылка Стефано на «прочитанную встроенную справочную страницу» объясняет его цель ... (для предотвращения интерпретации обратной косой черты). – Peter.O 9 March 2011 в 09:04

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]}
do 
  echo $elem
done
5
ответ дан 25 May 2018 в 22:41

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 25 May 2018 в 22:41
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]} do echo $elem done
5
ответ дан 25 July 2018 в 22:24

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=() while IFS= read -r -p "Next item (end with an empty line): " line; do [[ $line ]] || break # break if line is empty array+=("$line") done printf '%s\n' "Items read:" printf ' «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 25 July 2018 в 22:24
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]} do echo $elem done
5
ответ дан 26 July 2018 в 21:11

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=() while IFS= read -r -p "Next item (end with an empty line): " line; do [[ $line ]] || break # break if line is empty array+=("$line") done printf '%s\n' "Items read:" printf ' «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 26 July 2018 в 21:11
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]} do echo $elem done
5
ответ дан 31 July 2018 в 10:59

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=() while IFS= read -r -p "Next item (end with an empty line): " line; do [[ $line ]] || break # break if line is empty array+=("$line") done printf '%s\n' "Items read:" printf ' «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 31 July 2018 в 10:59
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]} do echo $elem done
5
ответ дан 2 August 2018 в 03:50

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=() while IFS= read -r -p "Next item (end with an empty line): " line; do [[ $line ]] || break # break if line is empty array+=("$line") done printf '%s\n' "Items read:" printf ' «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 2 August 2018 в 03:50
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

read -a arr

И для печати используйте:

for elem in ${arr[@]} do echo $elem done
5
ответ дан 4 August 2018 в 19:54

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):

array=() while IFS= read -r -p "Next item (end with an empty line): " line; do [[ $line ]] || break # break if line is empty array+=("$line") done printf '%s\n' "Items read:" printf ' «%s»\n' "${array[@]}"

См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashFAQ/001 и избегайте tldp-руководств, таких как Advanced bash scripting guide. [ ! d3]

2
ответ дан 4 August 2018 в 19:54
  • 1
    Хорошие ссылки ... Спасибо, что указали на проблему IFS. Не тянув его, «читать» скрипты все ведущие и конечные пробелы ... и, конечно же, -r тоже ... – Peter.O 9 March 2011 в 09:20

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или newer):

  array = (), а IFS = read -r -p «Следующий элемент (конец  с пустой строкой): «line;  do [[$ line]] ||  break # break if line is empty array + = ("$ line") done printf '% s \n' "Элементы, которые читаются:« printf »«% s »\n '" $ {array [@]} "  

Подробнее см. http://mywiki.wooledge.org/BashFAQ/001 .

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте tldp-руководств, таких как Advanced bash scripting guide.

2
ответ дан 6 August 2018 в 03:57

Прочтите это, используя это:

  read -a arr  

И для печати используйте:

  для  elem in $ {arr [@]} do echo $ elem done  
5
ответ дан 6 August 2018 в 03:57

Прочтите это, используя это:

  read -a arr  

И для печати используйте:

  для  elem in $ {arr [@]} do echo $ elem done  
5
ответ дан 7 August 2018 в 21:54

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или newer):

  array = (), а IFS = read -r -p «Следующий элемент (конец  с пустой строкой): «line;  do [[$ line]] ||  break # break if line is empty array + = ("$ line") done printf '% s \n' "Элементы, которые читаются:« printf »«% s »\n '" $ {array [@]} "  

Подробнее см. http://mywiki.wooledge.org/BashFAQ/001 .

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте tldp-руководств, таких как Advanced bash scripting guide.

2
ответ дан 7 August 2018 в 21:54

Прочтите это, используя это:

  read -a arr  

И для печати используйте:

  для  elem in $ {arr [@]} do echo $ elem done  
5
ответ дан 10 August 2018 в 10:09

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или newer):

  array = (), а IFS = read -r -p «Следующий элемент (конец  с пустой строкой): «line;  do [[$ line]] ||  break # break if line is empty array + = ("$ line") done printf '% s \n' "Элементы, которые читаются:« printf »«% s »\n '" $ {array [@]} "  

Подробнее см. http://mywiki.wooledge.org/BashFAQ/001 .

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте tldp-руководств, таких как Advanced bash scripting guide.

2
ответ дан 10 August 2018 в 10:09

И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или newer):

  array = (), а IFS = read -r -p «Следующий элемент (конец  с пустой строкой): «line;  do [[$ line]] ||  break # break if line is empty array + = ("$ line") done printf '% s \n' "Элементы, которые читаются:« printf »«% s »\n '" $ {array [@]} "  

Подробнее см. http://mywiki.wooledge.org/BashFAQ/001 .

И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте tldp-руководств, таких как Advanced bash scripting guide.

2
ответ дан 13 August 2018 в 16:30
  • 1
    Хорошие ссылки ... Спасибо, что указали проблему IFS . Без обнуления, «read» sripts все ведущие и конечные пробелы ... и, конечно, -r тоже ... – Peter.O 9 March 2011 в 09:20

Прочтите это, используя это:

  read -a arr  

И для печати используйте:

  для  elem in $ {arr [@]} do echo $ elem done  
5
ответ дан 13 August 2018 в 16:30

Другие вопросы по тегам:

Похожие вопросы: