Попытка заставить оператор printf выполняться один раз в цикле bash for

Ваш контроллер SATA возвращает сообщения об ошибках для команд чтения и записи.

Ошибка timeout, которая говорит о том, что контроллер не может связаться с вашими жесткими дисками, точнее не получает от них ответа.

Наиболее вероятной причиной проблемы является проблема с контактом кабелей SATA. Проверьте с другим жестким диском, другим кабелем, вставьте кабель в разные разъемы и т. д.

0
07.06.2021, 16:35
2 ответа

Вы можете провести тест на $i, как в:

    [[ "$i" -lt 1 ]] && printf "I am only printed once\n"

    # OR
    (( i < 1 )) && printf "I am only printed once\n"

    # OR
    ! (( i )) && printf "I am only printed once\n"

    # OR
    [ "$i" -lt 1 ] && printf "I am only printed once\n"

    # OR
    if [[ "$i" -lt 1 ]]; then
        printf "I am only printed once\n"
    fi

Предполагая, что вы не используете ассоциативный массив bash .

Короче говоря:Если индекс меньше 1, то вывести.


Для удобочитаемости я бы тоже разбил эти строки. Путь к ширине. Обратите внимание, что вы также можете сказать:

printf '%s %s some long text' \
"$var1" "$var2"

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

Информация также обычно должна быть напечатана на stderr, поэтому >&2.

Также использовал бы:

prinf '%s@%s' "${user[i]}" "$ip" >&2

вместо:

prinf "${user[i]}@$ip" >&2
1
28.07.2021, 11:27

Вывести заголовок, если в массиве userесть элементы.

if [[ ${#user[@]} -gt 0 ]]; then
    printf '%sCredentials Found!%s\n\n' "$NCB" "$NC"
fi

Затем сделайте свою петлю.

for i in "${!user[@]}"; do
    printf 'The Username & Password is %s : %s\n\n' "${user[i]}" "${pass[i]}" >> SSH-Credentials.txt

    cat <<END_MESSAGE
Log into the SSH server using ${YELLOW}ssh ${user[i]}@$ip$NC
When prompted, enter the password found: ${YELLOW}${pass[i]}$NC

END_MESSAGE
done
0
28.07.2021, 11:27

Теги

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