Условие Bash while :Верен ли мой тест? Бесконечная петля влечет за собой

Лучше использовать модуль подпроцесса .

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

Модуль подпроцесса предоставляет более мощные средства для создания новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этой функции.

Но вы можете использовать подстановку строк:

call_with_args = "./script2.py '%s' '%s'" % (str(arg1), str(arg2))
os.system(call_with_args)

Или формат строки

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'

-2
05.06.2021, 16:42
2 ответа

Я полагаю, что ваша проблема в основном заключается в непонимании логического типа в сценариях оболочки.

По сути, вы можете заменить первые вспомогательные функции этими:

#!/bin/bash

set -o nounset
set -o errexit

is_word ()
{
    local pattern='^[a-zA-Z0-9_-]+$'
    [[ "$1" =~ $pattern ]]
}

is_version_number ()
{
    local pattern='^[0-9]{1,2}(\.[0-9]{,2})*$'
    [[ "$1" =~ $pattern ]]
}

# testing is_word ()
if is_word 'bla01'; then
    echo IS word
else
    echo NOT word
fi

# testing is_version_number ()
if is_version_number '1.1'; then
    echo IS version number
else
    echo NOT version number
fi

Видите ли, не пытайтесь повторить true/false или что-то в этом роде, тестовая команда([..]или[[..]])сама возвращает правильное логическое (целое число ), никогда не используйте свои собственные конструкции true/false.

Кроме того, всегда используйте ShellCheck(https://www.shellcheck.net/)для проверки -ваших скриптов или их отладки.

Хорошей привычкой также является использованиеset -o nounset(set -uset -o errexit(set -e).


Судя по обновленной версии вашего вопроса, вы, вероятно, привыкли к программированию на C. В сценариях оболочки нет ни $ARGC, ни $ARGV. Используйте вместо них:

  • ARGC(количество аргументов):"$#"

  • ARGV(массив аргументов):"$@"


Например, вы можете сделать это:

eat_args ()
{
    for arg in "$@"; do
        current_char=${arg:0:1}
        echo "$current_char"
    done
}
eat_args "$@"

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

2
28.07.2021, 11:26

Решением является группировка условий, связанных через оператор ||.

while [[ $current_token_index -le $ARGC ]] && { [[ "$current_token" =~ ^[a-zA-Z0-9_-]+$ ]] || ! [[ "$current_token" =~ ^[0-9]{1,2}(\.[0-9]{,2})*$ ]]; }; do 
1
28.07.2021, 11:26

Теги

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