какова цель возврата 0 и возврата 1 и когда их использовать

В bashобработка длинных строк с циклами и индексами может быть очень медленной, в качестве альтернативы вы можете readпостроить строку и построить массив:

sequence="AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG"

declare -a seq=( "" )
while read -n 3 -r triple ; do seq+=( "$triple" ); done <<< "$sequence"
declare -p seq

Массив создается с индексом 0 пустой строки, поэтому ваши индексы начинаются с 1, как и требовалось.

Это работает следующим образом: используйте "read -n 3" для чтения трех символов за раз в переменную triple, добавьте ее в массив (+=), используя перенаправление <<<для представления последовательности в stdin. ]. readобрабатывает случаи, когда ввод не кратен 3.

(Как показано выше, это хорошо для чтения неразрывных последовательностей букв — это не универсальная процедура «разделения», поскольку она не имеет специальной обработки пробелов, escape-символов, нулевых байтов и т. д. Если вы установите IFS="", то readсохранит пробелы во входных данных. Если вам нужно удалить пробелы из ввода, вы можете использовать ... <<< ${sequence// /}.

Это частный случай более общей задачи Разделить строку на массив в Bash , где вы также можете прочитать обо всех интересных ловушках для неосторожного программиста.)

-4
13.11.2020, 20:55
2 ответа

0 означает отсутствие ошибок. Любое другое значение означает, что что-то пошло не так; даже отрицательные значения могут быть возвращены.

Насколько я знаю, нет другого стандарта для возвращаемых значений, кроме 0. Если вы хотите вернуть значение, отличное от 0, вы должны сообщить пользователям вашей программы, что означают разные значения/коды ошибок.

0
18.03.2021, 22:49

В Bash вы можете вернуть любое значение из функции, но оно усекается до 8 бит и становится беззнаковым. Когда вы проверите его с помощью $?, он будет находиться в диапазоне 0..255. Если вы не используете return для предоставления статуса, функция возвращает статус последней команды, выполненной внутри функции.

Те же $? механизм подстановки используется для получения статуса от внешних команд и от пользовательских функций. Но для внешних команд есть дополнительные зарезервированные значения. Поскольку в большом сценарии может быть неочевидно, какие вызовы относятся к функциям оболочки, а какие к внешним командам, благоразумно следовать тем же соглашениям,:

0 :Успех. Если опция оболочки -e включена, возврат ненулевого статуса -приведет к выходу из сценария, даже если команда действительно сработала.

>128 :Команда была прервана сигналом, поэтому не удалось вернуть статус завершения. Система предоставляет статус (128 + номер сигнала ).

127 :Оболочка запустила новый процесс, но команду найти не удалось.

126 :Оболочка запустила новый процесс, но найденная команда не является исполняемой.

Моя ссылка для этого

https://www.gnu.org/software/bash/manual/bash.html#Exit-Status

Раздел 4.3.1 того же документа содержит описание множества -e, которое показывает, как Bash присваивает особое значение нулевому статусу. Это подтверждается разделом EXIT STATUS справочной страницы для каждой команды.

Я не вижу здесь кода для "Не удалось разветвить" :126 и 127, по-видимому, возвращаются из собственного дочернего процесса оболочки. fork ()определенно может потерпеть неудачу (возвращает -1, errno EAGAIN или ENOMEM ), но какой статус Bash делает из этого, не указано :ясно, если это не удалось, нет дочернего процесса для обработки с этим.

Эксперименты, устанавливающие максимальное количество пользовательских процессов и запускающие новый bash, сломали Bash до такой степени, что он не отвечал при попытке прочитать статус.

Paul--) prlimit --nproc=400: bash
paul@paul-RV415-RV515 ~ $ export PS1='Limited--) '
Limited--) for j in {1..500}; do
> sleep 300 &
> Rc=$?
> (( Rc > 0 )) && { echo "${Rc}"; break; }
> done
[1] 5954
[2] 5955
....
[53] 6006
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
[54] 6007
[55] 6008
bash: fork: retry: Resource temporarily unavailable
....
[59] 6012
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
Limited--) RC=$?

^C
^C^C
## Killed from another terminal.
2
18.03.2021, 22:49

Теги

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