标签 脚本 下的文章

本章将介绍如何在 Bash Shell 脚本中使用数组。学习添加元素、删除元素和获取数组长度。

在本系列的前面部分中,你了解了变量。变量中可以有单个值。

数组内部可以有多个值。当你必须一次处理多个变量时,这会使事情变得更容易。你不必将各个值存储在新变量中。

因此,不要像这样声明五个变量:

distro1=Ubuntu
distro2=Fedora
distro3=SUSE
distro4=Arch Linux
distro5=Nix

你可以在单个数组中初始化它们所有:

distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

与其他一些编程语言不同,你不使用逗号作为数组元素分隔符。

那挺好的。让我们看看如何访问数组元素。

在 Bash 中访问数组元素

使用索引(数组中的位置)访问数组元素。要访问索引 N 处的数组元素,请使用:

${array_name[N]}
? 与大多数其他编程语言一样,Bash Shell 中的数组从索引 0 开始。这意味着第一个元素的索引为 0,第二个元素的索引为 1,第 n 个元素的索引为 n-1

因此,如果你想打印 SUSE,你将使用:

echo ${distros[2]}

Example of accessing array elements in bash shell

? ${ 之后或 } 之前不能有任何空格。你不能像 ${ array[n] } 那样使用它。

一次访问所有数组元素

假设你要打印数组的所有元素。

你可以一一使用 echo ${array[n]} 但这确实没有必要。有一个更好更简单的方法:

${array[*]}

这将为你提供所有数组元素。

Accessing all array elements at once in bash shell

在 Bash 中获取数组长度

如何知道数组中有多少个元素? 有一个专门的方法 在 Bash 中获取数组长度

${#array_name[@]}

就这么简单,对吧?

Get array length in bash

在 Bash 中添加数组元素

如果必须向数组添加其他元素,请使用 += 运算符 将元素追加到 Bash 中的现有数组

array_name+=("new_value")

这是一个例子:

Append new element to array

? 追加元素时使用 () 很重要。

你还可以使用索引将元素设置在任何位置。

array_name[N]=new_value

但请记住使用正确的索引编号。 如果在现有索引上使用它,新值将替换该元素。

如果你使用“越界”索引,它仍会添加到最后一个元素之后。例如,如果数组长度为 6,并且你尝试在索引 9 处设置新值,则该值仍将作为最后一个元素添加到第 7 个位置(索引 6)。

删除数组元素

你可以使用 Shell 内置的 unset 通过提供索引号来删除数组元素:

unset array_name[N]

这是一个示例,我删除了数组的第四个元素。

Delete array element in bash

你还可以通过 unset 来删除整个数组:

unset array_name
? Bash 中没有严格的数据类型规则。你可以创建一个同时包含整数和字符串的数组。

?️ 练习时间

让我们练习一下你所学到的有关 Bash 数组的知识。

练习 1:创建一个 Bash 脚本,其中包含五个最佳 Linux 发行版的数组。全部打印出来。

现在,用 “Hannah Montanna Linux” 替换中间的选择。

练习 2:创建一个 Bash 脚本,该脚本接受用户提供的三个数字,然后以相反的顺序打印它们。

预期输出:

Enter three numbers and press enter
12 23 44
Numbers in reverse order are: 44 23 12

我希望你喜欢通过本系列学习 Bash Shell 脚本。在下一章中,你将学习如何使用 if-else。敬请关注。

(题图:MJ/09477e2f-2bf9-4fdf-bc1e-c894a068adf2)


via: https://itsfoss.com/bash-arrays/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本系列的第四章,学习在 Bash 中使用基本数学运算。

你可以使用 Bash 脚本做很多事情。对变量执行简单的算术运算就是其中之一。

Bash shell 中算术运算的语法如下:

$((arithmetic_operation))

假设你必须计算两个变量的总和。你这样做:

sum=$(($num1 + $num2))

(()) 内空格的使用没有限制。你可以使用 $(( $num1+ $num2))$(( $num1+ $num2 )) 或者 $(( $num1+ $num2 ))。它们都一样。

在通过示例详细讨论之前,我先分享一下它支持的算术运算符。

Bash 中的基本算术运算符

以下是 Bash shell 中算术运算符的列表。

运算符描述
+加法
-减法
*乘法
/整数除法(不带小数)
%模除法(仅余数)
**求幂(a 的 b 次方)
? Bash 不支持浮点数(小数)。你必须使用其他命令(例如 bc)来处理它们。

Bash 中的加法和减法

让我们通过编写一个脚本来看看它,该脚本从用户那里获取两个数字,然后打印它们的总和和减法。

#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

我相信你熟悉上一章中使用 read 命令来 在 Bash 中接受用户输入

你应该关注这两行:

sum=$(($num1+$num2))
sub=$(($num1-$num2))

将此脚本保存为 sum.sh 并运行它。给它一些输入并检查结果。

Example of addition and subtraction in Bash shell script

Bash 中的乘法

现在让我们转向乘法。

这是一个将公里转换为米的示例脚本(这给美国读者带来了麻烦 ?)。作为参考,1 公里等于 1000 米。

#!/bin/bash

read -p "Enter distance in kilometers: " km
meters=$(($km*1000))

echo "$km KM equals to $meters meters"

将脚本保存为 multi.sh,赋予其执行权限并运行它。这是一个示例输出:

Multiplication in bash script

看起来不错,不是吗? 让我们继续进行除法。

Bash 脚本中的除法

让我们用一个非常简单的脚本来看看除法:

#!/bin/bash

num1=50
num2=5

result=$(($num1/$num2))

echo "The result is $result"

你很容易猜到结果:

The result is 10

没关系。但是让我们更改数字并尝试将 50 除以 6。结果如下:

The result is 8

但这不正确。 正确答案应该是 8.33333。

这是因为 Bash 默认情况下只处理整数。你需要额外的命令行工具来处理浮点(小数)。

最流行的工具是 bc,它是一种处理数学运算的非常强大的计算器语言。不过,你现在不需要关注细节。

你必须通过管道将算术运算“回显”给 bc

echo "$num1/$num2" | bc -l

于是,将之前的脚本修改为:

#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

现在你得到结果:

The result is 8.33333333333333333333

请注意 result=$(echo "$num1/$num2" | bc -l),它现在使用你在 本系列第 2 章 中看到的命令替换。

-l 选项加载标准数学库。默认情况下,bc 最多保留 20 位小数。你可以通过以下方式将比例更改为较小的位数:

result=$(echo "scale=3; $num1/$num2" | bc -l)

让我们看看 Bash 中浮点的更多示例。

在 Bash 脚本中处理浮点

让我们修改 sum.sh 脚本来处理浮点。

#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$( echo "$num1+$num2" | bc -l)
sub=$( echo "scale=2; $num1-$num2" | bc -l)
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

现在尝试运行它,看看是否可以正确处理浮点:

Floating points in bash script

?️? 练习时间

是时候一起做一些数学和 Bash 练习了。

练习 1:创建一个脚本,接受以 GB 为单位的输入并以 MB 和 KB 为单位输出其等效值。

练习 2:编写一个带有两个参数并以指数格式输出结果的脚本。因此,如果输入 2 和 3,输出将为 8,即 2 的 3 次方。

提示:使用幂运算符 **

练习 3:编写一个将摄氏度转换为华氏度的脚本。

提示:使用公式 F = C x (9/5) + 32。你必须在此处使用 bc 命令。

你可以在社区中讨论练习及其方案。

在下一章中,你将 了解 Bash 中的数组。敬请关注。

(题图:MJ/8a9dfb90-99a4-4203-bc44-d805d09bc16f)


via: https://itsfoss.com/bash-arithmetic-operation/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Bash 基础系列的这一章中,学习如何向 Bash 脚本传递参数并使它们具有交互性。

来让 Bash 脚本有参数吧 ?

你可以通过向 Bash 脚本传递变量来使其更加有用和更具交互性。

让我通过示例详细向你展示这一点。

将参数传递给 Shell 脚本

当你运行 Shell 脚本时,你可以按以下方式向其中添加其他变量:

./my_script.sh var1 var2

在脚本内部,你可以使用 $1 作为第一个参数,$2 作为第二个参数,依此类推。

? $0 是一个特殊变量,保存正在执行的脚本的名称。

让我们通过一个实际的例子来看看。切换到保存练习 Bash 脚本的目录。

mkdir -p bash_scripts && cd bash_scripts

现在,创建一个名为 arguments.sh (我想不出更好的名称)的新 Shell 脚本,并向其中添加以下行:

#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

保存文件并使其可执行。现在像往常一样运行脚本,但这次向其中添加任意两个字符串。你将看到屏幕上打印的详细信息。

? 参数由空格(空格、制表符)分隔。如果参数中有空格,请使用(英文)双引号将其引起来,否则它将被视为单独的参数。

Pass arguments to the bash scripting

? Bash 脚本最多支持 255 个参数。但对于参数 10 及以上,你必须使用花括号 ${10}${11}...${n}

正如你所看到的,$0 代表脚本名称,而其余参数存储在编号变量中。你还可以在脚本中使用一些其他特殊变量。

特殊变量变量描述
$0脚本名称
$1$2、……$9脚本参数
${n}脚本参数从 10 到 255
$#参数数量
$@所有参数
$$当前 Shell 的进程 ID
$!最后执行的命令的进程 ID
$?最后执行命令的退出状态
?️‍♀️ 修改上面的脚本以显示参数数量。

如果参数数量不匹配怎么办?

在上面的示例中,你为 Bash 脚本提供了两个参数并在脚本中使用了它们。

但是,如果你只提供一个参数或三个参数怎么办?

让我们实际做一下吧。

Passing fewer or more arguments to bash script

正如你在上面所看到的,当你提供的参数超出预期时,结果仍然是一样的。不使用其他参数,因此不会产生问题。

但是,当你提供的参数少于预期时,脚本将显示空白。如果脚本的一部分依赖于缺少的参数,这可能会出现问题。

接受用户输入并制作交互式 Bash 脚本

你还可以创建提示用户通过键盘提供输入的 Bash 脚本。这使你的脚本具有交互性。

read 命令提供了此功能。你可以这样使用它:

echo "Enter something"
read var

上面的 echo 命令不是必需的,但最终用户不会知道他们必须提供输入。然后用户在按回车键之前输入的所有内容都存储在 var 变量中。

你还可以显示提示消息并在单行中获取值,如下所示:

read -p "Enter something? " var

让我们看看它的实际效果。创建一个新的 interactive.sh Shell 脚本,内容如下:

#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

在上面的示例中,我使用 name 变量来获取名称。然后我在提示中使用 name 变量,并在 full_name 变量中获取用户输入。我使用了两种使用 read 命令的方法。

现在,如果你授予执行权限,然后运行此脚本,你会注意到该脚本显示 What is your name, stranger?,然后等待你从键盘输入内容。你提供输入,然后它会显示 What's your full name 消息,并再次等待输入。

以下是供你参考的示例输出:

Interactive bash shell script

?️ 练习时间

是时候练习你所学到的东西了。尝试为以下场景编写简单的 Bash 脚本。

练习 1:编写一个带有三个参数的脚本。你必须使脚本以相反的顺序显示参数。

预期输出:

abhishek@itsfoss:~/bash_scripts$ ./reverse.sh ubuntu fedora arch
Arguments in reverse order:
arch fedora ubuntu

练习 2:编写一个脚本,显示传递给它的参数数量。

提示:使用特殊变量 $#

预期输出:

abhishek@itsfoss:~/bash_scripts$ ./arguments.sh one and two and three
Total number of arguments: 5

练习 3:编写一个脚本,将文件名作为参数并显示其行号。

提示:使用 wc 命令来计算行号。

你可以在社区中讨论你的解决方案。

很好! 现在你可以(传递)参数了 ? 在下一章中,你将学习在 Bash 中执行基本数学运算。

(题图:MJ/5a75aa2f-1cb1-4009-a4e6-683cf61bc892)


via: https://itsfoss.com/bash-pass-arguments/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本章的 Bash 基础知识系列中,学习在 Bash 脚本中使用变量。

在 Bash 基础知识系列的第一部分中,我简要提到了变量。现在是时候在本章中详细了解它们了。

如果你曾经进行过任何类型的编码,你一定熟悉术语“变量”。

如果没有,请将变量视为保存信息的盒子,并且该信息可以随着时间的推移而改变。

让我们看看如何使用它们。

在 Bash shell 中使用变量

打开终端并使用一个随机的数字 4 初始化变量:

var=4

现在你有一个名为 var 的变量,它的值为 4。想验证一下吗? 通过在变量名前添加 $ 来访问变量的值。这称为参数扩展。

[abhishek@itsfoss]:~$ echo The value of var is $var
The value of var is 4
? 变量初始化时 = 前后不能有空格。

如果需要,你可以将该值更改为其他值:

Using variables in shell

在 Bash shell 中,变量可以是数字、字符或字符串(包括空格在内的字符)。

Different variable types in Bash shell

? 与 Linux 中的其他事物一样,变量名称也区分大小写。它们可以由字母、数字和下划线 “_” 组成。

在 Bash 脚本中使用变量

你是否注意到我没有运行 shell 脚本来显示变量示例? 你可以直接在 shell 中做很多事情.当你关闭终端时,你创建的那些变量将不再存在。

但是,你的发行版通常会添加全局变量,以便可以在所有脚本和 shell 中访问它们。

让我们再写一些脚本.你应该之前创建了脚本目录,但无论哪种情况,此命令都会处理该目录:

mkdir -p bash_scripts && cd bash_scripts

基本上,如果 bash_scripts 目录尚不存在,它将创建它,然后切换到该目录。

这里让我们使用以下文本创建一个名为 knock.sh 的新脚本。

#!/bin/bash

echo knock, knock
echo "Who's there?"
echo "It's me, $USER"

更改文件权限并运行脚本。你在上一章中已经学到了。

这是它为我生成的内容:

Using global variable in Bahs script

你是否注意到它如何自动将我的名字添加到其中? 这就是包含用户名的全局变量 $USER 的魔力。

你可能还注意到,我有时将 "echo 一起使用,但其他时候则不使用。这是故意的。bash 中的引号 有特殊含义。它们可用于处理空格和其他特殊字符。让我展示一个例子。

处理变量中的空格

假设你必须使用一个名为 greetings 的变量,其值为 hello and welcome

如果你尝试像这样初始化变量:

greetings=Hello and Welcome

你会得到这样的错误:

Command 'and' not found, but can be installed with:
sudo apt install and

这就是为什么你需要使用单引号或双引号:

greetings="Hello and Welcome"

现在你可以根据需要使用该变量。

Using spaces in variable names in bash

将命令输出分配给变量

是的!你可以将命令的输出存储在变量中并在脚本中使用它们。这称为命令替换。

var=$(command)

这是一个例子:

[abhishek@itsfoss]:~$ today=$(date +%D)
[abhishek@itsfoss]:~$ echo "Today's date is $today"
Today's date is 06/19/23
[abhishek@itsfoss]:~$

Command substitution in bash

旧语法使用反引号而不是 $() 进行命令替换。虽然它可能仍然有效,但你应该使用新的推荐符号。

? 变量会更改值,除非你声明一个“常量”变量,如下所示:readonly pi=3.14。在这种情况下,变量 pi 的值无法更改,因为它被声明为 readlonly

?️ 练习时间

是时候练习你所学到的东西了。这里有一些练习来测试你的学习情况。

练习 1:编写一个 bash 脚本,以以下格式打印你的用户名、当前工作目录、主目录和默认 shell。

Hello, there
My name is XYZ
My current location is XYZ
My home directory is XYZ
My default shell is XYZ

提示:使用全局变量 $USER$PWD$HOME$SHELL

练习 2: 编写一个 bash 脚本,声明一个名为 price 的变量.使用它来获取以下格式的输出:

Today's price is $X
Tomorrow's price is $Y

其中 X 是变量 price 的初始值,并且明天价格翻倍。

提示:使用 \ 转义特殊字符 $

练习的答案可以在社区的这个专用帖子中讨论。

在 Bash 基础知识系列的下一章中,你将了解如何通过传递参数和接受用户输入来使 bash 脚本具有交互性。

(题图:MJ/37c5c26e-3289-4ebd-b8ae-88eb8a3b2eb1)


via: https://itsfoss.com/bash-use-variables/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这是一个新教程系列的开始。在这一篇中,你将熟悉 bash 脚本。

本系列假定你对 Linux 终端比较熟悉。你不必精通,但了解基础知识会很好。我建议阅读终端基础知识系列。

这个系列适合谁?

任何想开始学习 Bash Shell 脚本的人。

如果你是一名将 Shell 脚本作为课程的一部分的学生,那么本系列适合你。

如果你是普通的桌面 Linux 用户,本系列将帮助你了解在探索各种软件和修复程序时遇到的大多数 Shell 脚本。你还可以使用它来自动执行一些常见的重复性任务。

到本 Bash 基础系列结束时,你应该能够编写简单到中等水平的 Bash 脚本。

该系列的所有章节都有示例练习,你可以边做边学。

? 你将在这里学习 Bash Shell 脚本。虽然还有语法基本相同的其他 Shell,但它们的行为在某些方面仍然存在差异。Bash 是最常见和通用的 Shell,因此学习 Shell 脚本从 Bash 开始吧。

你的第一个 Shell 脚本:Hello World!

打开一个终端。现在 创建一个新目录 来保存你将在本系列中创建的所有脚本:

mkdir bash_scripts

现在 切换到这个新创建的目录

cd bash_scripts

让我们在这里 创建一个新文件

touch hello_world.sh

现在,编辑该文件 并向其中添加一行 echo Hello World。你可以使用 cat 命令的追加模式(使用 >)执行此操作:

[abhishek@itsfoss]:~/bash_scripts$ cat > hello_world.sh 
echo Hello World
^C

我更喜欢在使用 cat 命令添加文本时添加新行。

Ctrl+CCtrl+D 键退出 cat 命令的追加模式。现在,如果你查看脚本 hellow_world.sh 的内容,你应该只看到一行。

Creating first shell script

关键时刻来了。你已经创建了第一个 Shell 脚本。是时候 运行 Shell 脚本 了。

这样做:

bash hello_world.sh

echo 命令只是显示提供给它的任何内容。在这种情况下,Shell 脚本应该在屏幕上输出 “Hello World”。

Run first shell script

恭喜! 你刚刚成功运行了第一个 Shell 脚本。多么酷啊!

以下是上述所有命令的重放,供你参考。

另一种运行 Shell 脚本的方法

大多数时候,你将以这种方式运行 Shell 脚本:

./hello_world.sh

这将产生错误,因为作为脚本的文件还没有执行权限。

bash: ./hello_world.sh: Permission denied

给脚本添加执行权限:

chmod u+x hello-world.sh

现在,你可以像这样运行它:

./hello_world.sh

Run shell scripts

因此,你学习了两种运行 Shell 脚本的方法。是时候让我们将注意力转回 Bash 了。

把你的 Shell 脚本变成 Bash 脚本

感到困惑? 实际上,Linux 中有几种可用的 Shell。Bash、Ksh、Csh、Zsh 等等。其中,Bash 是最受欢迎的,几乎所有发行版都默认安装了它。

Shell 是一个解释器。它接受并运行 Linux 命令。虽然大多数 Shell 的语法保持不变,但它们的行为在某些点上可能有所不同。例如,条件逻辑中括号的处理。

这就是为什么告诉系统使用哪个 Shell 来解释脚本很重要。

当你使用 bash hello_world.sh 时,你明确地使用了 Bash 解释器。

但是当你以这种方式运行 Shell 脚本时:

./hello_world.sh

系统将使用你当前使用的任何 Shell 来运行脚本。

为避免由于不同的语法处理而导致不必要的意外,你应该明确告诉系统它是哪个 shell 脚本。

怎么做? 使用释伴(#!)。通常,# 用于 Shell 脚本中的注释。但是,如果 #! 用作程序的第一行,它的特殊用途是告诉系统使用哪个 Shell。

因此,更改 hello_world.sh 的内容,使其看起来像这样:

#!/bin/bash

echo Hello World

现在,你可以像往常一样运行 Shell 脚本,因为你知道系统将使用 Bash Shell 来运行脚本。

Run bash shell script

? 如果你觉得在终端中编辑脚本文件不方便,作为桌面 Linux 用户,你可以使用 Gedit 或其他 GUI 文本编辑器编写脚本并在终端中运行。

?️ 练习时间

是时候练习你学到的东西了。以下是该级别的一些基本练习:

  • 编写一个打印 “Hello Everyone” 的 Bash 脚本
  • 编写一个显示当前工作目录的 Bash 脚本(提示:使用 pwd 命令)
  • 编写一个 Shell 脚本,使用以下列方式打印你的用户名:“My name is XYZ”(提示:使用 $USER

答案可以在社区论坛的 这个专门的帖子 中讨论。

最后一个练习使用 $USER。这是一个打印用户名的特殊变量。

这就引出了 Bash 基础系列下一章的主题:变量。

请继续关注下面的内容。

(题图:MJ/c8f6458a-84fe-4f77-9a9c-f82fef611935)


via: https://itsfoss.com/create-bash-script/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

各位读者,我们将在本文中介绍如何在 Linux 或 UNIX 系统中入门 Shell 脚本编写。

什么是 Shell 呢?

Shell(交互界面)是类 UNIX/Linux 操作系统中的一个解释器。它将用户输入的命令解释成操作系统的系统调用来执行这些命令。简单来说,Shell 形式上是操作系统的包装。比如,你可能使用 Shell 命令来列出目录中的文件,如 ls 命令,或使用命令复制,如 cp 命令。

$ ls
Desktop Documents Downloads Music Pictures playbook.yaml Public snap Templates test5 Videos

在上方的例子中,当你输入 ls 并按下回车键。$ 符号是 Shell 的提示符,意味着 Shell 等着命令的输入。下面的一行就是当前目录下的文件名。

什么是 Shell 提示符?

提示符,即 $,被称作命令提示符,是由 Shell 发出的(LCTT 译注:这个概念,可能有误。请参看:https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Controlling-the-Prompt )。当提示符出现后(LCTT 译注:此处提示符并不特指 $ 符号),你就可以输入命令了。Shell 将会在你按下回车键后读取你的输入。它会通过查看你输入的第一个单词来确定你希望执行的命令。“单词”指的是一组连续的字符。空格和制表符作为分割单词的标志。

不同类型的 Shell

由于没有限制只能有一个 Shell,你可以按照自己的意愿来自由选择运行任何一种 Shell。这当然挺好的,但是在不清楚其它替代方案的情况下选择一种 Shell 没有多大益处。下面列出了一些 UNIx/Linux 下常见的 Shell。

Sh(Bourne Shell)

最初的 Unix Shell 通常被称作 Sh,是 Shell(或 Bourne Shell)的简写,以其作者 Steven Bourne 命名。它在几乎所有的类 UNIX 操作系统下都可以找到。基本的 Bourne Shell 仅支持相当有限的命令行编辑。你可以输入字符,使用退格键删除字符,还有就是按下回车键来执行命令。当命令行出现异常了,你可以按下 Ctrl-C 组合键来终止整个命令。

Csh(C Shell)

它是由加利福尼亚大学伯克利分校的 Bill Joy 设计的,由于它的语法和 C 语言相似,所以被命名为 C Shell。这种 Shell 在 Bourne shell 的基础上增加了一些实用功能,尤其是可以重用之前的命令来帮助创建之后要执行的命令。当你去完成一项专门任务的时候,大多数的情况下需要执行不止一条命令,这样 C shell 的能力就相当有用了。

Ksh(Korn Shell)

它是由贝尔实验室的 David Korn 创造的,Korn Shell 提供了和 C Shell 相同的增强,其中有一项重要的不同:Korn Shell 提供了对旧的 Bourne Shell 语法的向后兼容。在 Unix 下,如 AIX & HP-UX 上,Korn Shell 是默认 Shell。

Bash(Bourne Again Shell)

Bash 提供了像 Korn Shell 一样的命令行编辑,像 C Shell 一样的文件名补全和许多其它的高级功能。许多用户认为 Bash 集 Korn Shell 和 C Shell 的优点于一身。在 Linux 和 Mac OS X 系统下,Bash 是默认的 Shell。

Tcsh(T C Shell)

Linux 系统推广了 Tcsh。Tcsh 扩展了传统的 csh,增加了命令行编辑、文件名补全和其它功能。例如,当你按下 Tab 键后,Tcsh 会补全文件和目录名(与 Bash 中的按键相同)。旧的 C Shell 不支持这项功能。

什么是 Shell 脚本呢?

Shell 脚本是包含一条或多条命令的文本文件。在 Shell 脚本中,Shell 程序假定文本文件的每一行是一条不同的命令。这些命令的大部分就和你在 Shell 窗口手动输入的一样。

为什么要使用 Shell 脚本呢?

Shell 脚本被用来自动化管理任务、简化复杂的配置细节,并且充分运用操作系统的性能。有了组合不同命令的能力就可以创造新命令了,从而增加操作系统的价值。此外,结合使用 Shell 与图形化桌面环境,可以兼得二者之长。

从系统管理员的角度看,日复一日的重复工作可以使用 Shell 脚本来实现自动处理,那就可以节约时间从事其它高质量的工作。

创建第一个 Shell 脚本

在当前工作目录下创建一个名为 myscript.sh 的文本文件,所有的 Shell 脚本都有 .sh 的扩展名(LCTT 译注:Linux 下根本没有扩展名一说,没有这个扩展一样是可以执行的)。脚本的第一行是 #!/bin/sh#!/bin/bash,因为 # 符号被称作 “hash” 并且 ! 符号被称作 “bang” 故被称为 shebang(释伴)。至于 /bin/sh/bin/bash 则指出了命令将被 Sh 还是 Bash shell 执行。

以下就是 myscript.sh 的内容:

#!/bin/bash
# Written by LinuxTechi
echo
echo "Current Working Directory: $(pwd)"
echo
echo "Today' Date & Time: $(date)"
DISK=$(df -Th)
echo
echo "Disk Space on System:"
echo "$DISK"

上方的脚本将会展示当前工作目录、今天的日期与时间,还有磁盘空间。我们需要用到 echo 命令 和其它 Linux 命令 来实现这个脚本。

使用如下的 chmod 命令 来给文件增加执行权限:

$ chmod a+x myscript.sh

现在来执行脚本:

$ sh myscript.sh
或
$ ./myscript.sh

注意:在当前目录下执行当前目录下的 Shell 脚本,须使用 ./<脚本名> 方式,如下所示:

在 Shell 脚本中获取用户输入

read 命令用来获取用户的键盘输入,并且将之赋值给一个变量。echo 命令用来展示内容。

让我们更改上方的脚本以使之获取输入:

#!/bin/bash
# Written by LinuxTechi
read -p "Your Name: " NAME
echo
echo "Today' Date & Time: $(date)"
echo
read -p "Enter the file system:" DISK
echo "$(df -Th $DISK)""

现在,再执行脚本试试,这回应该会有输入信息的提醒:

$ ./myscript.sh
Your Name: Pradeep Kumar

Today' Date & Time: Sat 15 Oct 05:32:38 BST 2022

Enter the file system:/mnt/data
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/volgrp01-lv01 ext4 14G 24K 13G 1% /mnt/data

完美,上方的输出表明脚本有输入提醒,并加工处理了相应的数据。

本文结束。希望对你是有用的。非常欢迎任何的疑问、反馈。

(题图:MJ/f83b771e-a70d-4c62-a169-ec42e9004a14)


via: https://www.linuxtechi.com/get-started-shell-scripting-linux/

作者:Pradeep Kumar 选题:lkxed 译者:cyberwaddle 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出