51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

一文了解LINUX bash脚本编写和使用

ShellLinux的核心部分。它允许使用cdlscat等各种命令与Linux 内核进行交互。

BashLinux的众多可用shell之一。它们具有大多数共同但不相同的语法。Bash是目前最流行的shell,也是大多数Linux发行版的默认版本。

我们打开一个终端或SSH会话,即使无法真正可视化它,也会在其中运行一个shell

键入命令时,shell会解释该命令。如果命令和语法正确,则将执行该命令,否则将看到错误。

# 当运行 Linux命令时,为什么要bash脚本?

可以直接在终端中输入命令,它们将被执行:

abhishek@itsfoss:~$ echo "hello world"
hello world

在脚本中也可以执行相同的操作:

abhishek@itsfoss:~$ cat >> script.sh
#!/bin/bash

echo "hello world"
abhishek@itsfoss:~$ bash script.sh
hello world

那为什么需要shell脚本呢?

因为这样我们不必一次又一次地键入相同的命令。要运行相同命令,只需运行shell脚本即可。

此外,如果我们脚本中有复杂的逻辑,那么在终端中键入所有逻辑将不是一个好方法。

例如,如果我们输入下面的命令,它将起作用。但是它并不容易理解,并且一次又一次地输入它(甚至在bash历史记录中搜索它)是一种痛苦。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

相反,我们可以放入一个shell脚本,这样易于理解和运行:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
 echo "You are root"
else
 echo "You are not root"
fi

上面的例子很简单。想象一下一个有五十或一百行的复杂脚本,这时候直接输入就不可能了。

# 通过本文我们可以学习到什么?

在这个bash脚本教程中有9个部分。可以了解并学习到:

  • 创建并运行一个bash shell脚本

  • 使用变量

  • bash脚本中传递参数并接受用户输入

  • 执行数学计算

  • 操作字符串

  • 使用条件语句,如if-else

  • 用于forwhileuntil循环

  • 创建函数

1.编写第一个 bash shell脚本

创建一个名为 :hello.sh

nano hello.sh

这将在终端中打开nano编辑器。输入以下行:

#!/bin/bash

echo "Hello World"

Ctrl+X键保存并退出nano编辑器。

然后按以下方式运行bash shell脚本:

bash hello.sh

然后输出下列信息:

Hello World

另一种方法是给脚本执行权限:

chmod u+x hello.sh

然后可以这样运行:

./hello.sh

2.在 bash 脚本中使用变量

变量可以用下面的方式声明:

var=some_value

然后以这样的方式访问变量:

$var

下面通过添加一个变量来修改之前的脚本:

#!/bin/bash

message="Hello World"

echo $message

运行脚本后,输出:

Hello World

3.将参数传递给 bash 脚本

可以在运行bash脚本时向其传递参数,像这样:

./my_script.sh arg1 arg2

在脚本内部,您可以使用 $1 来获取第一个参数,$2 来获取第二个参数,依此类推。$0 是一个特殊变量,它保存了正在执行的脚本的名称。

下面创建一个新的shell脚本,命名为 arguments.sh,并向其中添加以下行:

#!/bin/bash

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

然后这样运行它:

abhishek@itsfoss:~$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

一些特殊的变量列表汇总如下:

| 特殊变量 | 描述 | |---------------|----------------| | $0 | 脚本名 | | $1, $2...$9 | 脚本参数 | | ${n} | 脚本的第10到第255个参数 | | $# | 参数数量 | | $@ | 所有参数一起 | | $$ | 当前shell的进程ID | | $! | 最后执行的命令的进程ID | | $? | 最后执行命令的退出状态 |

另外我们还可以通过接受来自键盘的用户输入来使bash脚本具有交互性。

为此,需要使用read命令。

还可以使用read命令的-p选项来提示用户输入键盘输入,而无需单独使用echo命令。

#!/bin/bash

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

下面当运行脚本时,需要根据提示输入相应的参数:

abhishek@itsfoss:~$ ./argument.sh 
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash

4.进行算术运算

bash shell中进行算术运算的语法是这样的:

$((arithmetic_operation))

下面是可以在bash中执行的算术运算的列表:

| 运算符 | 描述 | |------|-------------| | + | 加法 | | - | 减法 | | * | 乘法 | | / | 整数除法(无小数) | | % | 模除(仅余数) | | ** | 指数运算(a的b次幂) |

下面是一个在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"

我们可以使用选择的任意随机数来执行这个shell脚本:

如果尝试进行除法运算,会遇到一个大问题。Bash默认只处理整数。它默认没有小数的概念。因此,10/3的结果会是3,而不是3.333

对于浮点运算,需要以这种方式使用bc命令:

#!/bin/bash

num1=50
num2=6

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

echo "The result is $result"

运行后结果如下:

The result is 8.33333333333333333333

5.在 bash 脚本中使用数组

与使用多个变量相比,可以在bash中使用数组来存储同一类别的值。

可以像这样声明一个数组:

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

访问其中的元素,可以这样写:

${array_name[N]}

像大多数其他编程语言一样,数组的索引从0开始。

可以像这样显示数组的所有元素:

${array[*]}

并且像这样获取数组的长度:

${#array_name[@]}

6.Bash 中的基本字符串操作

Bash能够执行多种字符串操作,获取字符串的长度可以用下面的方式:

${#string}

连接两个字符串:

str3=$str1$str2

通过提供子字符串的起始位置和长度来提取子字符串:

${string:$pos:$len}

举例如下:

也可以替换给定字符串的一部分:

${string/substr1/substr2}

可以从给定字符串中删除一个子字符串:

${string/substring}

7.在 Bash 中使用条件语句

可以通过使用ifif-else语句向bash脚本中添加条件逻辑。这些语句以.fi结尾,单个if语句的语法是:

if [ condition ]; then
  your code
fi

请注意使用和. [ ... ];then

if-else语句的语法是:

if [ expression ]; then

  ## execute this block if condition is true else go to next

elif [ expression ]; then

  ## execute this block if condition is true else go to next

else 

  ## if none of the above conditions are true, execute this block

fi

下面是一个使用if-else语句的bash脚本示例:

#!/bin/bash

read -p "Enter the number: " num

mod=$(($num%2))

if [ $mod -eq 0 ]; then
 echo "Number $num is even"
else
 echo "Number $num is odd"
fi

运行它,然后应该会看到这样的结果:

这被称为测试条件条件运算符 。有许多这样的运算符可以提供不同类型的比较:-eq

以下是可以用于数值比较的测试条件运算符:

| 条件 | 含义 | |-------------|---------------------| | $a -lt $b | a <b(a 小于b) | | $a -gt $b | a >b(a 大于b) | | $a -le $b | a <=b(a 小于或等于b) | | $a -ge $b | a >=b(a 大于或等于b) | | $a -eq $b | a 等于b | | $a -ne $b | a不等于b |

如果要比较字符串,可以使用这些测试条件:

| 条件 | 含义 | |---------|---------| | " b" | a 与b相同 | | " b" | a 与b相同 | | " b" | a与b不同 | | -z "$a" | a为空 |

还有用于检查文件类型的条件:

| 条件 | 含义 | |---------|--------| | -f $a | a是一个文件 | | -d $a | a是一个目录 | | -L $a | a是一个链接 |

8.在 bash 脚本中使用循环

Bash 支持三种循环:for 循环、while 循环和 until 循环。

下面是一个 for 循环的例子:

#!/bin/bash

for num in {1..10}; do
 echo $num
done

运行后,输出结果如下:

1
2
3
4
5
6
7
8
9
10

上面的例子也可以像这样使用 while 循环重写:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
 echo $num
 num=$(($num+1))
done

同样的,也可以使用 until 循环来重写:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
 echo $num
 num=$(($num+1))
done

9.在 bash 脚本中使用函数

Bash shell 支持函数的使用,这样你就不必一次又一次地编写相同的代码段。

这是声明 bash 函数的通用语法:

function_name() {
  commands
}

这是一个使用带有参数的函数的 bash 脚本示例:

#!/bin/bash

sum() {
 sum=$(($1+$2))
 echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

运行上面的脚本,输出结果如下:

Let's use the sum function
The sum of 1 and 5 is: 6

上面列举的例子只是bash脚本的冰山一角。它只是一个入门指南。bash 脚本编写还有更多内容,需要慢慢逐步探索。如果对bash脚本感兴趣,可以阅读***《Bash-Beginners-Guide》***。

一旦掌握了足够的 bash 基础知识,就可以通过这本免费书籍来学习高级 bash 脚本编写:***《Advanced Bash-Scripting Guide》***

赞(4)
未经允许不得转载:工具盒子 » 一文了解LINUX bash脚本编写和使用