介绍神奇的Shell脚本世界

1,376 阅读3分钟

外壳脚本

shell脚本使用Linux命令来执行一项特定的任务。它提供了循环和条件控制结构,重复Linux命令或对你要执行的命令做出决定。如果你已经有一些编程的经验,它将非常容易学习(一个非常基本的水平也可以)。

Shell脚本提供了自动化,使重复性任务、系统监控更容易执行。它更容易上手。系统管理员使用shell脚本进行常规备份和其他各种任务。

根据定义,shell是一个解释环境,你在其中执行命令。它为用户提供了一个界面,并接受人类可读的命令进入系统,执行那些可以自动运行的命令,并给出程序的输出。当你运行终端时,Shell会发出**一个命令提示(通常是$),**你可以在那里输入你的输入(命令),然后在你点击Enter键时执行。此后,输出或结果将显示在终端上。考虑一下下面的图片,在发出ls命令时,它将列出所有的项目。

外壳的类型

有不同类型的shell可用于Linux发行版。

  • BASH(Bourne Again SHell)--这是由Brian Fox为GNU项目编写的Unix shell和命令语言,是Bourne shell的自由软件替代者。它是Linux系统中最广泛使用的外壳。它在Linux系统和macOS中被用作默认的登录外壳。你也可以在Windows操作系统上安装它。
  • CSH (C SHell)- 这是一个Unix shell,由Bill Joy在1970年代末在加州大学伯克利分校当研究生时创建。C shell的语法和用法与C编程语言非常相似。
  • KSH (Korn SHell)- KornShell (ksh) 是一个Unix shell,它是由David Korn在1980年代早期在贝尔实验室开发的,并于1983年7月14日在USENIX宣布。Korn Shell也是POSIX Shell标准规范等的基础。

你可以通过以下命令得到你的shell提示符的名称

echo $SHELL

$符号代表一个shell变量,echo将返回你输入的任何文本。

如何编写shell脚本?

你可以使用文本编辑器来编写shell脚本。在你的Linux系统上,打开一个文本编辑器程序,打开一个新的文件开始输入一个shell脚本或shell编程,然后给shell权限来执行你的shell脚本 。

让我们了解一下创建一个Shell脚本的步骤。

  1. 使用 vi编辑器(或任何其他编辑器)创建一个文件
  2. 用扩展名**.sh**来命名该文件。
  3. 用**#!/bin/sh**(She-bang).
  4. 写一些代码。
  5. 保存该脚本文件。
  6. 用命令chmod +x<**fileName>.**sh使脚本可执行。
  7. 为了执行脚本,输入bash .sh或./<fileName>.sh。****

注意: 我们可以把脚本作为bash的一个命令行参数来运行,也可以授予脚本执行权限,使其成为可执行的。

Shebang

符号#**!被称为she-bang,写在脚本的开头。它将指令传递给与#!**相对应的程序。

要在一个特定的shell中运行你的脚本(你的系统应该支持这个shell),在你的脚本的开头用#! 跟随shell的名字。

#!/bin/bash  
echo Hi Knolders  
#!/bin/ksh  
echo Hello Knoldus

shell脚本中的变量

变量 以字符和数字的形式存储数据。同样,Shell变量也是用来存储信息的,它们只能由Shell调用。下面是一个将使用变量的小脚本。脚本语言通常不要求在使用前进行变量类型声明,因为它们可以直接被分配。此外,还有一些变量被shell环境和操作环境用来存储特殊的值,这些变量被称为环境变量

要查看与终端有关的所有环境变量,请发出env命令。一些著名的环境变量有HOME , PWD , USER , UID , SHELL , 等等。

env

对于每一个进程,其运行时的环境变量都可以通过查看。

cat /proc/$PID/environ
#!/bin/sh
echo "what is your name?"
read name
echo "How do you do, $name?"
read reply
echo "Great to see you."

在上面的脚本中,你可以注意到'name'和'address'是变量,可以用$<variable_name>来使用。

让我们来执行一个shell脚本

尝试以上述类似的方式执行给定的代码,并观察其输出。创建一个名为**"while_loop.sh "的bash文件以了解while循环的用法。在这个例子中,while循环将迭代10次。count变量的值将在每一步中增加1**。当count变量的值达到10时,while循环将终止。

#!/bin/bash
valid=true
count=1
while [ $valid ]
do
echo $count
if [ $count -eq 10 ];
then
break
fi
((count++))
done

运行该文件。

数组和关联数组

数组是一个非常重要的组件,可以使用索引将数据集合作为独立的实体进行存储。普通的数组只能使用整数作为其数组索引。另一方面,Bash也支持关联数组,可以使用字符串作为其数组索引。要使用关联数组,你必须有Bash版本4或更高的版本。

  1. 你可以用很多方法来定义数组。在一行中使用数值列表定义一个数组,如下所示。

array_var=(1 2 3 4 5 6)#值将被存储在从索引0开始的连续位置。

或者,将数组定义为一组索引-值对,如下所示。

array_var[0]="test1"
array_var[1]="test2"
array_var[2]="test3

2.使用以下命令打印指定索引处的数组内容。

echo {array\_var\[0\]} test1 index=2 echo {array_var[$index]}
test3

3.用以下命令将数组中的所有数值打印成一个列表:

echoecho{array_var[*]}
test1 test2 test3

另外,你也可以使用。

echoecho{array_var[@]}
test1 test2 test3

4.打印一个数组的长度(数组中的元素数量),如下所示。

echoecho{#array_var[*]}
3

定义关联数组

  1. 声明关联数组的语句
$ declare -A ass_array

2.声明之后,可以使用以下两种方法将元素添加到关联数组中。

  • 通过使用inline index-value list方法,我们可以提供一个索引-值对的列表。
  • 另外,你可以使用单独的索引-值分配。
$ ass_array=([index1]=val1 [index2]=val2)
$ ass_array[index1]=val1
$ ass_array'index2]=val2

3.数组有用于索引每个元素的索引。普通数组和关联数组在索引类型上有所不同。我们可以通过以下方式获得数组中的索引列表。

$ echo ${!array_var[*]}

或者,我们也可以使用。

$ echo ${!array_var[@]}

函数和参数

我们可以创建函数来执行任务,我们也可以创建接受参数(也叫参数)的函数,你可以在下面的步骤中看到。

  1. 一个函数可以定义如下:
syntax to use:
 syntax1:
 function function_name
 {
 ##set of commands
 }
 syntax2:
 function_name()
 {
 ##set of commands
 }
#!/bin/bash

var1='Hello'
var2='Knolders'

my_function () {
  local var1='Hi'
  var2='everyone'
  echo "Inside function: var1: $var1, var2: $var2" # var1: Hi var2: everyone
}

echo "Before executing function: var1: $var1, var2: $var2" 
# var1: Hello var2: Knolders

my_function

echo "After executing function: var1: $var1, var2: $var2" 
# var1: Hello  var2: everyone
   

2.人们可以通过使用其名称来调用该函数。

$ fname ; # executes function

3.你可以把参数传给函数,并且可以访问.参数可以传给函数,并且可以被我们的脚本访问。

fname arg1 arg2 ; # passing args

下面是函数fname的定义。在fname函数中,我们包含了各种访问函数参数的方法。

fname()
{
echo $1, $2; #Accessing arg1 and arg2
echo "$@"; # Printing all arguments as list at once
echo "$*"; # Similar to $@, but arguments taken as single entity
return 0; # Return value
}

同样地,你可以把参数传递给脚本,你可以通过脚本来访问它:$0(脚本的名称)。

  • 1美元是第一个参数
  • $2是第二个参数
  • $n是第n个参数
  • "$@"扩展为 "1""2""3",以此类推
  • "\*"扩展为"1c\*"扩展为 "1c2c$3" ,其中c是IFS的第一个字符
  • "@""@"比"*"更经常被使用,因为前者将所有的参数作为一个字符串提供。

迭代器/循环

循环在迭代一连串的值时非常有用。Bash提供了许多类型的循环。让我们看看如何使用它们。

使用for循环 (SYNTAX):

for var in list;
do
commands; # use $var
done
list can be a string, or a sequence.
#Start of for loop
for a in 1 2 3 4 5
do
	# if a is equal to 5 break the loop
	if [ $a == 5 ]
	then
		break
	fi
	# Print the value
	echo "Iteration no $a"
done

While循环 (SYNTAX):

while condition
do
commands;
done

对于一个无限的循环,使用true作为条件。

使用 Until 循环 (SYNTAX):

Bash有一个叫做until的特殊循环。这个循环一直执行到给定的条件为真。你可以看到下面的例子.

x=0;
until [ $x -eq 9 ]; # [ $x -eq 9 ] is the condition
do
let x++; echo $x;
done

条件性控制

使用if条件 (SYNTAX):

if condition;
then
commands;
fi

使用else if和else (SYNTAX):

if condition;
then
commands;
else if condition; then
commands;
else
commands;
fi
#!/bin/sh

a=10
b=20

if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ] #-gt is comparator for greater than
then
   echo "a is greater than b"
elif [ $a -lt $b ] #-lt is comparator for less than
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi

本博客到此结束。它是否有帮助?我们将很高兴知道你的意见并回答你的问题。