- 什么是 Shell 脚本
- Shell 脚本是一种解释型的脚本语言,它用于在 Unix/Linux 操作系统的 Shell 环境中自动化执行一系列命令。Shell 本身是一个命令行解释器,它接收用户输入的命令并将其传递给操作系统内核去执行。而 Shell 脚本就是将多个命令组合在一起,按照一定的逻辑顺序来执行,从而实现更复杂的任务。
- 例如,你可能需要每天备份一个文件目录。手动操作的话,你需要使用
cp
或tar
等命令来复制或打包文件。通过 Shell 脚本,你可以把这些命令写在一个文件中,设置好执行的时间(比如使用cron
),这样系统就会自动按照脚本中的命令来备份文件了。
- Shell 脚本的基本结构
- 第一行:通常以
#!/bin/bash
开头(这是使用 Bash 作为解释器的情况)。#!
是一个特殊的标记,它告诉系统这个脚本应该用哪个程序来解释执行,后面跟着解释器的路径。除了 Bash,还有其他的 Shell 解释器,如/bin/sh
(Bourne Shell)、/bin/zsh
(Z Shell)等。 - 注释:在脚本中,以
#
开头的行是注释。注释用于解释脚本的功能、意图或者某个命令的作用,它不会被执行。例如:# 这是一个备份文件的脚本
。 - 命令行:脚本的主要部分是命令行,它可以是系统命令(如
ls
、cp
、mv
等)、程序调用(如调用自定义的 Python 或 Java 程序)或者是 Shell 脚本自身的控制结构(如if - else
、for
循环等)。
- 编写第一个 Shell 脚本
- 打开一个文本编辑器(如
vi
、vim
或nano
),创建一个新文件,例如命名为first_script.sh
。 - 在文件中输入以下内容:
#!/bin/bash
# 这个脚本用于打印当前目录下的文件列表
ls -l
- 保存文件后,需要给这个脚本赋予执行权限。在终端中,进入脚本所在的目录,然后运行
chmod +x first_script.sh
。chmod
是用于改变文件权限的命令,+x
表示给文件添加可执行权限。 - 现在可以执行这个脚本了,在终端中输入
./first_script.sh
(./
表示当前目录),就会看到当前目录下的文件列表以长格式(-l
选项的作用)显示出来。
- 变量和数据类型
- 定义变量:在 Shell 脚本中,变量定义很简单,不需要事先声明类型。例如,
name="John"
就定义了一个名为name
的变量,其值为John
。变量名通常是字母、数字和下划线的组合,但不能以数字开头。 - 使用变量:要使用变量的值,可以在变量名前加
$
符号。例如,echo $name
会输出变量name
的值。如果变量名和其他字符连在一起,为了避免歧义,可以用{}
将变量名括起来,如echo ${name}Doe
。 - 数据类型:Shell 脚本中的变量数据类型主要有字符串、整数等。但它没有像高级编程语言那样严格的类型定义。例如,一个变量可以既用于存储数字,又用于存储字符串,不过在进行数值运算等操作时需要注意格式。
- 控制结构
if - else
语句:用于根据条件执行不同的代码块。例如:
#!/bin/bash
num=10
if [ $num -gt 5 ]; then
echo "这个数字大于5"
else
echo "这个数字小于等于5"
fi
- 这里
[ $num -gt 5 ]
是条件判断部分,-gt
表示大于。if
语句会检查这个条件是否成立,如果成立就执行if
代码块中的内容,否则执行else
代码块中的内容。 for
循环:用于重复执行一段代码。例如,要打印从 1 到 5 的数字:
#!/bin/bash
for i in {1..5}
do
echo $i
done
for
循环中的{1..5}
表示一个范围,从 1 到 5,每次循环变量i
会取这个范围内的一个值,然后执行do
和done
之间的代码块,也就是打印变量i
的值。
这只是 Shell 脚本的入门知识,还有很多高级的主题,如函数、数组、信号处理等等待你去学习。
】】】】】】
判断,大于小于等于………
- 数值比较操作符(在
[ ]
中使用)
-lt
(Less Than):用于判断左边的数值是否小于右边的数值。例如:
num1=3
num2=5
if [ $num1 -lt $num2 ]; then
echo "$num1 is less than $num2"
fi
- 这里,
-lt
操作符会比较num1
和num2
的值,因为 3 小于 5,所以会输出3 is less than 5
。 -le
(Less than or Equal to):判断左边的数值是否小于等于右边的数值。例如:
num1=5
num2=5
if [ $num1 -le $num2 ]; then
echo "$num1 is less than or equal to $num2"
fi
- 由于 5 等于 5,满足小于等于的条件,所以会输出相应的内容。
-eq
(Equal to):检查左右两边的数值是否相等。例如:
num1=10
num2=10
if [ $num1 -eq $num2 ]; then
echo "$num1 is equal to $num2"
fi
- 当两个数值相等时,会输出
10 is equal to 10
。 -ne
(Not Equal to):用于判断左右两边的数值是否不相等。例如:
num1=7
num2=9
if [ $num1 -ne $num2 ]; then
echo "$num1 is not equal to $num2"
fi
- 因为 7 和 9 不相等,所以会输出
7 is not equal to 9
。 -ge
(Greater than or Equal to):判断左边的数值是否大于等于右边的数值。例如:
num1=8
num2=6
if [ $num1 -ge $num2 ]; then
echo "$num1 is greater than or equal to $num2"
fi
- 8 大于 6,满足大于等于的条件,所以会输出相应的内容。
- 字符串比较操作符(在
[ ]
中使用)
=
(Equal to):用于判断两个字符串是否相等。例如:
str1="hello"
str2="hello"
if [ $str1 = $str2 ]; then
echo "The two strings are equal"
fi
- 当两个字符串内容相同时,会输出
The two strings are equal
。需要注意的是,在[ ]
中使用==
来比较字符串也是可以的,不过=
更常见。 !=
(Not Equal to):判断两个字符串是否不相等。例如:
str1="world"
str2="hello"
if [ $str1!= $str2 ]; then
echo "The two strings are not equal"
fi
- 因为
world
和hello
不同,所以会输出The two strings are not equal
。 -z
(Zero length):检查字符串的长度是否为零。例如:
str1=""
if [ -z $str1 ]; then
echo "The string is empty"
fi
- 当字符串为空时,会输出
The string is empty
。不过在使用-z
时要小心,如果变量没有赋值,可能会导致错误,最好是先给变量赋一个初始值或者在使用前进行检查。 -n
(Not Zero length):与-z
相反,用于判断字符串长度是否不为零。例如:
str1="not empty"
if [ -n $str1 ]; then
echo "The string is not empty"
fi
- 因为字符串
not empty
长度不为零,所以会输出The string is not empty
。