В сторону :вашего (примера?)cat
и awk
бесполезны, и вам не нужны повторные echo|cut
и тесты.
После разъяснения того, что вам нужно ввести пароль (s )для удаленного sudo, вам нужно оба позволить ssh
использовать ввод терминала и указать -t
, чтобы он пересылал этот ввод как PTY. Это в основном обман SSH вызывает остановку цикла while , хотя вы не достигли того же симптома.
Метод 1 :перенаправить (или передать )стандартный ввод для цикла, но перенаправить его назад для ssh
while read inst type serial; do
case ${inst#*-} in
(DIF1) ssh
Метод 2 :использовать другой блок -номер (не стандартный )для всех данных
while read <&3 inst type serial; do
case ${inst#*-} in
(DIF1) ssh -t user@host1 "sudo blah";;
(DIF2) ssh -t user@host2 "sudo blech";;
# more
esac
done 3
Метод 3 заключается в использовании for
цикла (, которого вы не использовали, хотя в вашем вопросе сказано, что вы )читали его аргументы без какого-либо канала.Для вашего исходного Q, который на самом деле использовал только одно поле, это легко:
IFS='
' # split on newline only
set -o noglob # disable globbing
for inst in $(awk '{print $1}' alldata); do
# as for method 2
done
но ваше редактирование говорит, что вы хотите использовать хотя бы одно другое поле, поэтому вам нужно что-то более уродливое, например:
IFS='
' # split on newline only
set -o noglob # disable globbing
for line in $(awk '{print $1":"$2":"$3}' alldata); do
IFS=:; set -- $line; inst=$1; serial=$3;
# as before
done
Вы по-прежнему сможете видеть nvme0
в /dev
--, только записи-nX
должны исчезнуть. Попробуйте sudo nvme create-ns -s 100000 -b 4096 /dev/nvme0
, затем sudo nvme attach -n 1 /dev/nvme0
и посмотрите, заработает ли это снова.