所以我写了一个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/
答案 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