В основном это дубликат новых строк и переменной bash , хотя это не распространяется на массивы. Оттуда, чтобы использовать переменную, содержащую несколько строк, вам нужно разделить расширение параметра на новую строку и пропустить подстановку, и в зависимости от ваших данных, возможно, избежать других искажений:
usbs=$( lsusb... )
IFS=$'\n' # ksh bash zsh; in other shells you may need to quote an actual newline
set -o noglob # or more tersely set -f
for i in $usbs; do
printf '%s\n' "$i" # not echo which sometimes modifies some data
done
# if you do further things in the same script (or function) you may
# need to re-set IFS and/or glob, which may require saving them first
Для массива readarray/mapfile
, предложенный Джесси _b, является самым простым, поскольку он уже разбивается на строки. Но вы можете сделать это "вручную" так же, как описано выше :
.
set -o noglob # ditto
IFS=$'\n' usbs=( $( lsusb... ) ) # only ksh up has arrays so $'' safe
# set +o noglob or set +f if needed
for i in "${usbs[@]}"; do # quoted array[@] forces splits equal to array elements only
printf '%s\n' "$i"
done