Bash — автоматизация создания тестовых файлов

Я нахожусь в процессе понимания сценариев оболочки — это мой простой код для добавления тестовых файлов для Python модульный тест

Я ищу указатели на передовой опыт, имена переменных и, конечно, комментарии по структуре и удобочитаемости.

EDIT: скрипт вызывается, например

./create_tests.sh math tensor_add
dir_name="$1"
file_name="$2"
test_dir="test/${dir_name}"
file_in_dir="${test_dir}/${file_name}.py"

addFile() {
    if [[ -f "${file_in_dir}" ]]
    then
        echo "File already exists in directory, exiting."
        exit 0
    else
        touch "${file_in_dir}"
    fi
}

if [[ -d "${test_dir}" ]]
then
    echo "Directory already exists, adding the file to this directory."
    addFile
else
    echo "Directory and __init__.py created."
    mkdir "${test_dir}"
    touch "${test_dir}/__init__.py"
    addFile
fi

1 ответ
1

  1. Добавьте шебанг.
  2. Продолжайте давать названия, я лично предпочитаю и следую Руководство по стилю Google; вы можете использовать другое руководство, если оно есть.
  3. Попробуйте сделать свой скрипт совместимым с POSIX для более широкого охвата цели (не нужно полагаться на [[ expression from bash)
  4. Define a function to create the test directory.
  5. Use shellcheck.
  6. The echo "Directory and __init__.py created." should happen after the creation has happened.
  7. Use mkdir -p to allow for nested directories to also be created (if needed).
  8. Let script throw error and stop as early as possible on errors. This is achieved with set -e.

Together:

#!/bin/sh

set -e

dir_name="$1"
file_name="$2"
test_dir="test/${dir_name}"
file_in_dir="${test_dir}/${file_name}.py"

add_file() {
    if test -f "${file_in_dir}"
    then
        echo "File already exists in directory, exiting."
        exit 0
    else
        touch "${file_in_dir}"
    fi
}

create_dir() {
    mkdir -p "${test_dir}"
    touch "${test_dir}/__init__.py"
    echo "Directory and __init__.py created."
}

[ ! -d "${test_dir}" ]  && create_dir "$ {test_dir}" add_file

Фрагмент объявлений переменных (dir_name, file_name и т. д.) также могут быть локализованы для функций.

  • 1

    Вы пропустили «извлечь общие строки из if/else«из списка — хотя вы продемонстрировали это в своем переработанном коде.

    — Тоби Спейт


  • Спасибо за отличный совет. Один вопрос: в чем разница между двойными скобками и одинарными скобками в моей реализации против вашей? Связано ли это с соответствием POSIX?

    — Эдвин Карлссон

  • stackoverflow.com/q/669452/2002471 объясняет, почему двойные скобки — это хорошо. Стремление к совместимости с POSIX после того, как bash и Linux захватили мир, — это интересный приоритет. Я надеюсь, что читаемость кода и ремонтопригодность в наши дни важнее. Исходя из if [[ к if test имеет смысл для людей, которые понимают, как работает оболочка if, но я бы сказал, что это делает ее менее читаемой и интуитивно понятной для большинства людей.

    — цыплята

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *