深圳幻海软件技术有限公司 欢迎您!

利用 Shell 脚本自动化命令的五种方法

2023-02-28

当您的计算机可以为您完成时,不要浪费时间记住长命令。本文使用的是MacOSShell编写由UNIX终端执行的命令序列。这意味着您可以使用它们与命令行界面(CLI)进行交互,甚至可以编写自己的逻辑。本文将向您展示如何使用简单的shell脚本作为您自己的CLI。Shell脚本的用例缩短长CLI函数运行多

当您的计算机可以为您完成时,不要浪费时间记住长命令。

本文使用的是 MacOS

Shell 编写由 UNIX 终端执行的命令序列。 这意味着您可以使用它们与命令行界面 (CLI) 进行交互,甚至可以编写自己的逻辑。 本文将向您展示如何使用简单的 shell 脚本作为您自己的 CLI。

Shell 脚本的用例

  • 缩短长 CLI 函数
  • 运行多个连续函数
  • 实现逻辑以确定要执行的适当命令

制作 bin 目录

如果您希望能够从任何地方运行您的脚本,那么好消息,您可以!

基于 UNIX 的操作系统(例如 MacOS 和 Linux)会将位于 ~/bin 目录中的所有 shell 脚本纳入范围。

通过在终端中运行以下命令来检查您是否拥有它。

$ [[ -d ~/bin ]] && echo "Directory ~/bin exists." || echo "Directory ~/bin does not exist"
  • 1.

如果你没有这个文件夹,你的终端会回复“目录~/bin 不存在”。

如果您收到此消息,请运行命令 mkdir ~/bin。

示例 1:Hello World

让我们从一个基本脚本开始,以帮助您掌握它!

在您的终端中,执行以下命令:

$ cd ~/bin
$ touch hello
$ chmod 777 hello
  • 1.
  • 2.
  • 3.

这会将您的终端移动到 bin 作为您的工作目录,创建一个名为 hello 的文件,并授予它作为可执行文件运行的权限。 在您选择的代码编辑器中打开文件。

#!/bin/bash
echo "World!"
  • 1.
  • 2.

注意:#!/bin/bash 告诉您的设备将文件作为 bash 脚本运行,没有它脚本将无法运行。

现在让我们运行文件!

如您所见,我可以从计算机上的任何目录运行脚本!

示例 2:引入参数

既然我们已经掌握了基础知识,那么在进入我一直使用的脚本之前,让我们看一下稍微复杂一点的 hello world 版本!

Shell 脚本保留了变量名称,例如 $1、$2、$3 等。这些是命令行参数的替身。 让我们在我们的 hello 脚本中使用它们,如下所示:

#!/bin/bash
echo "hello $1"
  • 1.
  • 2.

让我们将这个概念应用到一个真实的例子中。

许多使用 Java 编码的人可能都知道,您必须先将 .java 文件编译为 .class 才能运行它,这是两个单独的命令。 让我们制作一个 shell 脚本,将它们组合成一个“编译并运行”命令!

如果您在创建新脚本时需要帮助,可以跳回 hello world 步骤。 我将此文件称为“javab”

#!/bin/bash
javac $1 # compile to .class
/bin/java ${1:-5} # point to local java function, run
  • 1.
  • 2.
  • 3.

示例 3:缩短现有命令

如果你之前用过FFmpeg压缩过视频文件,你就会知道这个命令并不短,而且通常每一步都很难记住。 这是一个使用 25 的恒定速率因子 (CRF) 的示例。

ffmpeg -i file.mov -vcodec libx264 -crf 25 newfile.mp4
  • 1.

这是我经常运行的命令,用于压缩 mac 屏幕录制并将其转换为 mp4。 让我们尝试使用 shell 脚本来简化它!

如果你没有安装 FFmpeg,你可以在这里下载。

#!/bin/bash
ffmpeg -i $1 -vcodec libx264 -crf $2 $3
  • 1.
  • 2.

我称这个文件为“压缩”。

现在,我可以从任何工作目录压缩视频并将新文件保留在同一目录中。 如果你愿意,你可以添加一些额外的逻辑,比如

#!/bin/bash
ffmpeg -i $1 -vcodec libx264 -crf $2 ${1%.*}.mp4 && rm $1
  • 1.
  • 2.

此命令将 $1 中文件名的扩展名去掉,并将其替换为 .mp4。 如果命令运行成功,则删除原始文件,否则不执行任何操作

示例 5:循环和 If

这将是我们最后的也是最复杂的例子,但它也是我使用最多的例子。

如果您曾经有许多不同的遥控器链接到 heroku、github、bitbucket 等,并且想要推送到所有这些,那总是很麻烦。

特别是如果您进行了许多小提交并希望与同事分享您的最新更改以防止合并冲突。

这是一个简短的“保存”脚本,它将提交您的最新更改,然后推送到您的遥控器!

#!/bin/bash
commit=$1 # set var commit to argument 1
if [ -z "$commit" ] # if commit is empty
then
    commit="autosave" 
fi
git commit -am "$commit"
output=$(git remote) # run git remote and save all remotes
pusharray=($output) # convert to array
for i in ${pusharray[@]}; do # for every item in pusharray, git push
    git push $i
done
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

结论

总之,您已经学会了如何使用参数、字符串操作、条件(if 语句和 &&)和循环来自动化本地命令行工作流。

您现在能够更好地利用您的 shell 脚本知识来推进您的工作并节省一些时间!