Bash Shell脚本介绍

编写Bash Shell脚本的详细概述

Shell脚本是一种自动执行您通常在计算机上执行的任务的强大方法。

在本教程中,我将对Shell脚本进行全面的概述,并且将作为创建实用Shell脚本的更深入和高级教程的基础参考。

看看我的Bash简介邮政。

Bash为您提供了一组可以组合在一起的命令,这些命令可用于创建小程序,按照惯例,我们将其称为脚本。

注意区别。我们不是说Bash编程,而是说Bash脚本,我们也没有将Bash脚本称为“ Bash程序”。这是因为在感觉脚本失控之前,您通常可以达到一定程度的复杂性。

但是Bash脚本很棒,因为您只需要Bash即可运行它们。没有编译器,没有解释器,只有您的shell。

Perl或JavaScript或Python等编程语言会遗漏许多东西。

变量没有作用域,它们都是全局变量,没有标准库,例如,您没有模块系统。但是优点非常棒:您可以像在shell中一样轻松地调用任何CLI工具,而Unix方法具有许多小的实用程序命令的确使Shell脚本大放异彩。执行网络请求wget,使用awk, 和更多。

Shell脚本是您最好了解的工具之一,至少知道如何在看到程序时阅读程序,以及它可以带给您日常工作的好处。

本教程将引导您了解Bash脚本编制的理论和概念。我将在以后发布有关特定技术或如何解决特定问题的更详细的教程。

基本

脚本存储在文件中。您可以为shell脚本指定任何名称和扩展名,这没关系。重要的是,它必须在第一行以“ shebang”开头:

#!/bin/bash

并且它必须是一个可执行文件。

使用以下命令将文件设置为可执行文件chmod,一个实用程序命令。

您可以像这样使用它:

chmod u+x myscript

使myscript您的用户的文件可执行文件(我不在这里的权限兔子洞中,但我会尽快对其进行介绍)。

现在,如果您位于同一文件夹中,则可以通过调用脚本来执行该脚本./myscript,或使用完整路径。

在学习的同时,我鼓励您(如果可能)使用在线游乐场像这个,它使事情更容易测试。

评论

注释是编写程序时最重要的事情之一。一行以#符号是注释(除了您在上面看到的shebang线以外)。

#!/bin/bash
# this is a comment

评论也可以在行尾开始:

#!/bin/bash
echo ok # this is a comment

变数

您可以使用=操作员:

name=value

例子:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

您可以使用echo内置命令并在前面加一个$改为var名称:

echo $ROOM_NUMBER
echo $name

运营商

Bash实现了一些跨编程语言常用的算术运算符:

  • +添加
  • -减去
  • *
  • /划分
  • %模(除法除法)
  • **求幂

您可以使用以下方法比较值

  • <
  • <=
  • ==
  • >=
  • >

您还可以使用以下比较运算符:

  • -lt低于
  • -gt比...更棒
  • -le低于或等于
  • -ge大于或等于
  • -eq等于
  • -ne不等于

这样:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

逻辑运算符:

  • &&逻辑与
  • ||逻辑或

这些快捷方式允许执行算术运算,然后执行赋值:

  • +=
  • -=
  • *=
  • /=
  • %=

还有更多的运算符,但是那些是最常见的。

您可以使用echo命令:

#!/bin/bash
echo "test"
echo test
echo testing something

逻辑条件

AND:计算为0(零),如果两者都commandanothercommand执行并返回0。在shell命令中返回零表示该命令成功。错误消息由非零返回值标识。

command && anothercommand

或:计算结果为0(零),如果至少有以下一项commandanothercommand执行并返回0

command || anothercommand

NOT:反转的逻辑返回值command

! command

控制结构

在其中可以使用几种您可能熟悉的控制结构:

如果/其他语句

简单的if

if condition
then
  command
fi

if然后else

if condition
then
  command
else
  anothercommand
fi

巢状if- 然后 -else

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

您可以保留else使用分号在同一行上:

if condition ; then
  command
fi

例子:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

注意括号吗?当我们必须对布尔表达式进行任何形式的评估时,必须添加方括号。

循环

While循环

尽管condition解析为真实值,运行command

while condition
do
  command
done

直到

直到condition解析为真实值,运行command

until condition
do
  command
done

对于

遍历列表并为每个项目执行命令

for item in list
do
  command
done

打破并继续

在循环内部,您可以使用breakcontinue语句完全打破循环,或者只是跳过当前迭代。

案子

案例控制结构使您可以根据值选择不同的路由。

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

喜欢与fiesac结束案例结构,您会发现它是case向后拼写。

在每种情况下,我们都添加一个双分号。

一种*)case可以处理所有未明确表述的情况。用一个|符号,您可以为一个案例表达多种选择。

例子:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

选择

一种select结构向用户显示一个可供选择的菜单:

select item in list
do
  command
done

例子:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

测试条件

我用这个词condition在上述控制结构中。

您可以使用testBash内置命令来检查条件并返回true(0)或假值(不是0)。

这是一个例子:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

从命令行读取输入

您可以使用read内置命令。该命令从标准输入中读取一行,并且可以非常灵活地格式化输入。

最简单的用法是:

echo "Age:"
read age

这将打印“ Age:”(年龄:),您可以输入数字,按Enter键,该数字将分配给age多变的。

-p的选择read提供内置提示,并将输入内容放入age多变的:

read -p "Age: " age

read该命令还有更多选项,您可以通过键入以下选项进行检查help read在Bash中。

添加选项

使用连字符和字母来指定选项,如下所示:

ls -a
driveCar -b "Ford"

在代码中,您使用内置命令getopts解析选项并获取值。

如果我们接受选择ab,我们喂getopts ab到一会儿循环。

如果选择b接受一个值,我们附加一个冒号:之后,所以我们格式化getopts像这样打电话:getopts ab: arg

这是一个片段:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

在此脚本中,$OPTARG自动分配了选择字母。我们告诉getopts我们接受哪些选项,并且我们分别处理每种情况。

错误由以下人员自动处理getopts。我们可以选择自己处理错误消息,方法是在冒号前加一个:在参数定义之前:getopts :xy: arg

然后我们还要处理\?:案件。当我们传递无效的选项时,第一个被调用,而当我们错过一个选项时,第二个被调用:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

现在,如果您错过添加参数的操作,错误消息将有所不同。

使用参数

在脚本内部,您可以访问在调用时传递的任何参数。您可以使用访问它们$0$1$2依位置而定,依此类推$0是命令的名称,数字递增,参数的位置递增。在位置9之后,您需要大括号:${10}${11}

例如运行此startCar脚本:

#!/bin/bash
echo $0
echo $1

作为./startCar fiesta将打印

./startCar
fiesta

特别的$*语法显示所有参数,并且$#传递的参数数量:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

将选项与参数分开

如果同时具有选项和参数,则需要将它们分开。您可以使用连字符进行此操作:

driveCar -m "Ford Fiesta" - Milan Florence Rome

使用字符串

给定一个字符串:

dogname="Roger"

你可以使用它来获取长度${#dogname}

与字符串一起使用时,请始终在字符串两边使用引号,以避免Bash解释其中的特殊字符。

您可以使用来比较2个字符串=或者==运算符,是一样的:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

这不是一项作业,因为周围的空间=

您还可以检查不平等情况:

"$dogname" != "$anotherdogname"

数组

数组是在括号内声明的项目列表:

breeds=(husky setter "border collie" chiwawa)

您可以使用方括号引用数组中的任何项目:

breeds[0]
breeds[1]

您可以使用以下特殊语法获取商品总数:

${#breeds[@]}

内置命令

到目前为止,您已经看到了一些内置命令,例如:

  • test
  • read
  • echo

Bash有很多。您可以通过致电查看所有内容help然后您可以使用以下命令找到每个命令的帮助help read

功能

就像在JavaScript或任何其他编程语言中一样,您可以创建少量可重用的代码,给它们命名,并在需要时调用它们。

Bash称他们为功能

您定义一个函数

function name {

}

例子:

function cleanFolder {

}

然后像这样调用它:

cleanFolder

您可以将参数传递到文件夹,而无需声明它们-您只需将它们引用为$1$2等等。就像您对脚本参数所做的那样:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

免费下载我的Linux命令手册


更多cli教程: