Лучше использовать модуль подпроцесса .
>>> 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'
Я полагаю, что ваша проблема в основном заключается в непонимании логического типа в сценариях оболочки.
По сути, вы можете заменить первые вспомогательные функции этими:
#!/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 -u
)иset -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 "$@"
что для меня не имеет особого смысла, так как печатает первую букву каждого заданного аргумента. Здоровья и удачи.
Решением является группировка условий, связанных через оператор ||
.
while [[ $current_token_index -le $ARGC ]] && { [[ "$current_token" =~ ^[a-zA-Z0-9_-]+$ ]] || ! [[ "$current_token" =~ ^[0-9]{1,2}(\.[0-9]{,2})*$ ]]; }; do