仅使用参数运行Shell脚本的一部分

时间:2019-06-28 23:06:24

标签: bash shell scripting

所以我写了一个shell脚本,该脚本按顺序执行命令。但是,它变得有点大,我需要对代码中的3个不同部分进行划分。我是Shell脚本的新手,那么将这3部分代码放入函数(?)中的一种好方法是什么呢?我可以在命令行中使用自变量来调用这些函数以跳过或将其包含在shell脚本运行中?

任何帮助将不胜感激!

编辑:我应该发布一些示例代码,所以可以说这是3个部分,我将如何在运行Shell脚本时在命令行中传递参数,这取决于我传递的内容。如果也是另一种方式,也将是有益的,例如跳过第一步:

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 个答案:

答案 0 :(得分:1)

您可以将代码段抽象为函数,然后触发应使用命令行参数运行的函数。在下面的示例中,您可以使用以下命令运行脚本: ./script.sh --install-requirements --aws-copy或等效的./script.sh -i -a

如果愿意,可以使用case语句(类似于C / C ++中的switch)来代替下面的多个if,有关更多详细信息,请参见底部的资源。

如果要在函数内部使用命令行参数,则可以使用$@转发它们,如下所示: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

资源: