Shell 脚本编写与运行指南(七)

在 Linux 系统中,Shell 脚本是一种强大的工具,可以帮助你自动化各种任务。本文将详细介绍如何编写和运行 Shell 脚本,包括基本语法、变量处理、字符串操作和数组使用等内容。无论你是初学者还是有一定经验的开发者,都能从中受益。

什么是 Shell?

Shell 是一个用 C 语言编写的程序,充当用户与 Linux 操作系统之间的桥梁。它不仅是一种命令语言,还是一种程序设计语言。通过 Shell,用户可以访问操作系统内核的各种服务。常见的 Shell 类型包括:

  • Bourne Shell(/usr/bin/sh 或 /bin/sh)
  • Bourne Again Shell (Bash)(/bin/bash)
  • C Shell(/usr/bin/csh)
  • Korn Shell(/usr/bin/ksh)

本文将重点关注 Bash,因为它是大多数 Linux 系统的默认 Shell,且因其易用性和免费性而被广泛使用。

创建和运行 Shell 脚本

创建第一个 Shell 脚本

  1. 打开文本编辑器:使用 vi 或 vim 命令创建一个新的文件,例如 test.sh。
  2. 编写脚本:在文件的第一行添加解释器路径,通常是 #!/bin/bash。这行代码告诉系统使用哪个 Shell 来解释脚本。
#!/bin/bash
echo "Hello, World!"
  1. 保存文件:确保文件保存在当前目录中。

运行 Shell 脚本

运行 Shell 脚本有多种方法:

1. 作为可执行程序

  1. 赋予执行权限:使用 chmod 命令赋予脚本执行权限。
chmod +x ./test.sh
  1. 执行脚本:使用 ./ 前缀来指定当前目录下的脚本。
./test.sh

注意:必须使用 ./test.sh 而不是 test.sh,因为 test.sh 会让系统在 PATH 环境变量中查找该文件,而当前目录通常不在 PATH 中。

2. 作为解释器参数

  1. 直接运行解释器:将脚本文件名作为参数传递给解释器。
/bin/bash test.sh
  1. 运行 PHP 脚本:类似地,可以运行其他语言的脚本。
/bin/php test.php

这种方式运行的脚本不需要在第一行指定解释器信息,即使指定了也不会生效。

变量和赋值

变量命名规则

  • 有效变量名:只能包含字母、数字和下划线,且不能以数字开头。
  • 无效变量名:不能使用保留关键字,如 if、for 等。
# 有效的变量名
_var="123"
var2="abc"

# 无效的变量名
if="some_value"  # 避免使用 if 作为变量名
variable_with_$=42  # 不能包含特殊字符
?var=123  # 不能以特殊字符开头
user*name=runoob  # 不能包含特殊字符
variable with space="value"  # 不能包含空格

赋值和使用变量

  1. 直接赋值:使用 = 进行赋值,等号两侧不能有空格。
variable_name=value
  1. 使用变量:在变量名前加 $ 符号。
your_name="qinjx"
echo $your_name
echo ${your_name}

注意:${} 是可选的,但在变量名后面紧跟其他字符时,使用 ${} 可以帮助解释器识别变量的边界。

变量重新赋值

已定义的变量可以被重新赋值,但第二次赋值时不能使用 $ 符号。

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被修改。

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"  # 这行会报错

删除变量

使用 unset 命令可以删除变量。删除后,变量不能再被使用。

#!/bin/bash
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl  # 没有任何输出

字符串操作

字符串定义

字符串可以用单引号、双引号或不加引号来定义。

my_string='Hello, World!'
my_string="Hello, World!"

单引号和双引号的区别

  • 单引号:单引号中的任何字符都会原样输出,变量无效,不能包含单独的单引号。
  • 双引号:双引号中的变量会被解析,可以包含转义字符。
your_name="runoob"
str="Hello, I know you are \"$your_name\"!\n"
echo -e $str

拼接字符串

可以使用双引号或单引号拼接字符串。

your_name="runoob"
greeting="hello, $your_name !"
greeting_1="hello, ${your_name}!"
echo $greeting
echo $greeting_1

greeting_2='hello, ' $your_name ' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2
echo $greeting_3

获取字符串长度

使用 ${#string} 获取字符串的长度。

string="abcd"
echo ${#string}  # 输出 4

提取子字符串

从字符串中提取子字符串。

string="runoob is a great site"
echo ${string:1:4}  # 输出 unoo

查找子字符串

查找字符在字符串中的位置。

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

数组操作

定义数组

数组可以用括号来表示,元素用空格分隔。

my_array=(1 2 3 4 5)

也可以单独定义数组的各个元素。

my_array[0]=1
my_array[1]=2
my_array[2]=3

读取数组

使用 ${数组名[下标]} 读取数组元素。

echo ${my_array[0]}  # 输出 1

获取数组的所有元素

使用 @ 或 * 获取数组的所有元素。

echo ${my_array[@]}  # 输出 1 2 3 4 5

获取数组的长度

使用 ${#数组名[@]} 获取数组的长度。

length=${#my_array[@]}
echo $length  # 输出 5

注释

单行注释

以 # 开头的行是注释,会被解释器忽略。

# 这是一条注释

多行注释

可以使用 :<<EOF 格式进行多行注释。

:<<'EOF'
这是注释的部分。
可以有多行内容。
EOF

使用函数实现多行注释

将需要注释的代码块定义为一个函数,不调用该函数即可实现注释效果。

comment() {
    echo "这是注释的部分。"
    echo "可以有多行内容。"
}

总结

通过本文,你已经了解了如何编写和运行 Shell 脚本,包括变量的定义和使用、字符串操作、数组操作以及注释的使用。掌握了这些基础知识,你可以在日常工作中更加高效地使用 Shell 脚本来自动化各种任务。希望本文对你有所帮助,祝你在 Shell 编程的道路上越走越远!