Запускать только части сценария оболочки с аргументами - PullRequest
1 голос
/ 29 июня 2019

поэтому я написал сценарий оболочки, который выполняет команды последовательно.Тем не менее, он стал немного большим и есть 3 отдельных части кода, которые мне нужно разделить.Я новичок в сценариях оболочки, так что же это хороший способ поместить эти 3 раздела кода в функции (?), Которые я могу вызывать с аргументами в командной строке, чтобы пропустить или включить их в запуск сценария оболочки?

Любая помощь будет принята с благодарностью!

Редактировать: я должен был опубликовать пример кода, поэтому предположим, что это 3 раздела, как мне передать аргументы в командной строке при запуске оболочкисценарий, который будет делать один из них в зависимости от того, что я передам.Также было бы полезно, если бы это было иначе, например, пропустив первый шаг:

pip install -r ./docker/requirements.txt

ZIP_FILE=spark.zip
zip -r $ZIP_FILE file.py

S3_BUCKET_PATH=$S3_BUCKET_PATH
aws s3 cp $ZIP_FILE $S3_BUCKET_PATH/lib/

1 Ответ

1 голос
/ 29 июня 2019

Вы можете абстрагировать сегменты вашего кода в функции, а затем запустить, какие функции следует запускать с аргументами командной строки. В приведенном ниже примере вы можете запустить скрипт, например, с помощью ./script.sh --install-requirements --aws-copy или эквивалентно ./script.sh -i -a.

Если вы предпочитаете, вместо нескольких if, приведенных ниже, можно использовать операторы case (аналогично switch в C / C ++), подробнее см. Ресурсы внизу.

Если вы хотите использовать аргументы командной строки внутри функций, вы можете переслать их с помощью $@, например: InstallRequirements "$@". Вы также можете передать любые другие аргументы, например: InstallRequirements arg1 arg2, функция будет видеть их так же, как скрипт видит аргументы командной строки.

Также обратите внимание, что почти всегда лучше заключать переменные в двойные кавычки: rm -rf "$filename" вместо rm -rf $filename. rm без кавычек очень опасно, если имя файла содержит пробелы.

#!/bin/bash

function InstallRequirements {
  pip install -r ./docker/requirements.txt
}

function ZipFile {
  ZIP_FILE=spark.zip
  zip -r "$ZIP_FILE" file.py
}

function AwsCopy {
  S3_BUCKET_PATH=$S3_BUCKET_PATH
  aws s3 cp "$ZIP_FILE" "$S3_BUCKET_PATH/lib/"
}

###

for arg in "$@"; do
  if [[ "$arg" = -i ]] || [[ "$arg" = --install-requirements ]]; then
    ARG_INSTALL_REQUIREMENTS=true
  fi
  if [[ "$arg" = -z ]] || [[ "$arg" = --zip-file ]]; then
    ARG_ZIP_FILE=true
  fi
  if [[ "$arg" = -a ]] || [[ "$arg" = --aws-copy ]]; then
    ARG_AWS_COPY=true
  fi
done

###

if [[ "$ARG_INSTALL_REQUIREMENTS" = true ]]; then
  InstallRequirements
fi

if [[ "$ARG_ZIP_FILE" = true ]]; then
  ZipFile
fi

if [[ "$ARG_AWS_COPY" = true ]]; then
  AwsCopy
fi

Ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...