Shell
是Linux
的核心部分。它允许使用cd
、ls
、cat
等各种命令与Linux
内核进行交互。
Bash
是Linux
的众多可用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
-
用于
for
、while
和until
循环 -
创建函数
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 中使用条件语句
可以通过使用if
或if-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》***