Shell 脚本编程15分钟入门
Shell 脚本编程教程
1. Shell简介
Shell是一种脚本语言,可以使用脚本来控制系统的各种操作和任务。Shell 脚本包含一系列命令,这些命令组合在一起实现自动化的任务。Shell非常强大和灵活,包含许多操作系统命令和工具。
常见的Shell包括:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(bash)(/bin/bash)
- C Shell(csh)(/usr/bin/csh)
- K Shell(ksh)(/usr/bin/ksh)
- Shell for Root(sh)(/sbin/sh)
Linux系统默认使用bash shell。本文将主要讲解bash shell的脚本编程。
2. 第一个Shell脚本
编写一个简单的Shell脚本来输出"Hello World"。
(1) 新建HelloWorld.sh脚本
#!/bin/bash
echo "Hello World!"
- 第一行 #!/bin/bash 指定该脚本使用bash解释器
- 第二行编写命令
(2) 运行脚本
$ chmod +x HelloWorld.sh # 添加可执行权限
$ ./HelloWorld.sh
Hello World!
3. 变量
变量用于存储值,方便重复使用。
(1) 定义变量
name="John"
变量名和等号之间不能有空格。
(2) 使用变量
使用$来获取变量的值:
echo $name
输出:
John
也可以用{}包裹变量名:
echo ${name}
(3) 只读变量
使用readonly命令可以将变量定义为只读:
readonly name
只读变量无法修改。
(4) 删除变量
使用unset命令可以删除变量:
unset name
4. 字符串
字符串可以用单引号或者双引号表示。
(1) 单引号字符串
name='John'
单引号内的任何字符都会原样输出。
(2) 双引号字符串
name="John"
双引号里可以有变量。
echo "Hello $name" # Hello John
(3) 字符串操作
- $name:获取字符串长度
- ${name:0:4}:提取子字符串
- ${name#word}:删除开头匹配的word
- ${name%word}:删除结尾匹配的word
- ${name/old/new}:替换第一个old为new
5. 数组
数组可以存储多个值。
(1) 定义数组
names=(John Bob Lucy Tom)
数组元素之间用空格分隔。
也可以单独定义每个元素:
names[0]=John
names[1]=Bob
(2) 读取数组
使用${数组名[索引]}读取元素:
echo ${names[0]} # John
echo ${names[1]} # Bob
使用@可以获取整个数组:
echo ${names[@]} # John Bob Lucy Tom
(3) 获取数组长度
使用#获取数组元素个数:
echo ${#names[@]} # 4
6. 参数
我们可以向脚本传入参数,在脚本中访问参数。
(1) 向脚本传参数
例如有个test.sh脚本:
echo $0 # 打印脚本名
echo $1 # 打印第1个参数
echo $2 # 打印第2个参数
运行时传入参数:
./test.sh hello world
输出:
./test.sh
hello
world
1-{10}表示。
(2) 特殊参数
- $#:获取参数总数
- $@:代表所有参数,以数组形式存储
- $*:代表所有参数,作为一个整体字符串
例如:
#!/bin/bash
echo $# # 2
echo $@ # hello world
echo $* # hello world
7. 运算符
Shell支持多种算术和逻辑运算符。
(1) 算术运算符
a=10
b=20
echo $((a + b)) # 30
echo $((a - b)) # -10
echo $((a * b)) # 200
支持 + - * / %
等算术运算。
注意expr命令的限制:
- 运算符之间要有空格
- 整个表达式要被``包裹
- *要转义为*,/同理
expr 10 + 20 # 30
expr 10 \* 20 # 200
expr做字符串连接使用|:
a=hello
b=world
expr $a \| $b # helloworld
(2) 关系运算符
- -eq检查是否相等
- -ne检查是否不等
- -gt/-lt检查大于/小于
- -ge/-le检查大于等于/小于等于
例如:
[ 10 -eq 20 ] # False
[ 10 -gt 5 ] # True
需要注意[ ]表达式和空格。
(3) 逻辑运算符
- !非
- -o或
- -a和
例如:
[ ! 10 -eq 20 ] # True
[ 10 -lt 20 -a 10 -gt 5 ] # True
8. 条件判断
条件判断可以决定运行哪些命令。
(1) if语句
if语句最基本的语法:
if [ 条件判断 ]; then
程序
fi
示例:
count=100
if [ $count -eq 100 ]; then
echo "Count is 100"
fi
if else语句:
if [条件]; then
程序1
else
程序2
fi
if elif else语句:
if [条件1]; then
程序1
elif [条件2]; then
程序2
else
程序3
fi
(2) case语句
case语句可以匹配多个值:
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
默认程序
esac
示例:
read -p "输入1-3:" num
case $num in
"1")
echo "你选择了1"
;;
"2")
echo "你选择了2"
;;
"3")
echo "你选择了3"
;;
*)
echo "你没有输入1-3"
esac
9. 循环语句
循环可以多次执行代码块。
(1) for循环
for循环一般用于遍历数组和字符串。
for 变量 in 值1 值2 ...
do
程序
done
示例:
for name in Tom John Bill
do
echo "Hello $name"
done
也可以用{1..10}表示1-10的整数序列。
(2) while循环
while循环通过判断条件来执行循环。
while [ 条件判断 ]
do
程序
done
示例:
count=1
while [ $count -le 5 ]
do
echo $count
count=$((count+1))
done
(3) until循环
until循环与while相反,条件为false时执行循环。
until [ 条件判断 ]
do
程序
done
10. 函数
函数可以封装代码片段实现代码重用。
(1) 定义函数
function fun_name() {
#代码
}
也可以:
fun_name() {
#代码
}
示例:
function sayHello() {
echo "Hello $1"
}
(2) 调用函数
直接使用函数名调用:
sayHello "John" # Hello John
函数可以接收参数,在函数内部通过2等来引用参数。
函数也可以返回值通过$?。
11. 输入/输出
Shell提供了输入和输出的命令。
(1) 输出
- echo:打印输出
- printf:格式化输出
- read:从输入读取值
例如:
echo "Hello"
read name
echo "Hello $name"
运行结果:
Hello
John # 用户输入
Hello John
(2) 文件输入输出
- cat:打印文件内容
- wc:统计字数
- grep:匹配查找
- sort:排序
- uniq:去重
- >:重定向输出
- >>:追加
- <:输入重定向
- |:管道,连接命令
例如:
cat file.txt | grep 'hello' >> result.txt
12. 实战范例
下面通过一些实例,来实战运用Shell脚本:
(1) 备份脚本
编写一个脚本,完成文件夹的压缩打包备份:
#!/bin/bash
# 获取当前日期
date=$(date +%Y%m%d)
# 文件备份路径
archive_dir="/data/backup/$date"
# 如果备份目录不存在,创建目录
if [ ! -d "$archive_dir" ]; then
mkdir -p $archive_dir
fi
# 压缩打包文件
tar -czf "$archive_dir/archive.tar.gz" /data/
echo "Done"
(2) 监控脚本
编写一个简单的监控脚本,每隔1秒查询一次系统负载:
#!/bin/bash
while true
do
load=$(uptime | awk '{print $8,$9,$10}')
echo "$(date) Load: $load"
sleep 1
done
可以看到实时输出系统负载信息。
(3) 下载脚本
使用wget命令编写一个批量下载文件的脚本:
#!/bin/bash
URL_LIST=url_list.txt
while read line; do
wget $line
done < $URL_LIST
url_list.txt内每行包含一个下载链接。
总结
以上内容总结了Shell脚本的基本语法和功能,可以通过实际的例子熟练掌握Shell编程
在本文的Shell脚本编程教程中,我们学习了以下主要内容:
-
Shell简介:介绍了Shell是一种脚本语言,以及常见的Shell类型。
-
第一个Shell脚本:编写了一个简单的Shell脚本输出"Hello World"。
-
变量:学习了如何定义、使用和删除变量,并了解了只读变量的概念。
-
字符串:探讨了单引号和双引号字符串的使用,并介绍了字符串操作的一些技巧。
-
数组:了解了如何定义、访问和获取数组的长度。
-
参数:学习了如何向脚本传递参数,并了解了特殊参数的用法。
-
运算符:探讨了算术、关系和逻辑运算符的使用。
-
条件判断:学习了if、if else和case语句的使用,以及如何在Shell中进行条件判断。
-
循环语句:介绍了for、while和until循环的使用。
-
函数:学习了如何定义和调用函数,并了解了函数的参数和返回值。
-
输入/输出:了解了如何进行输出和输入操作,以及文件输入输出的基本命令。
-
实战范例:通过备份脚本、监控脚本和下载脚本的实例,展示了Shell脚本在实际应用中的用途。
总的来说,本程教程包含了基本的语法和实战示例,适合初学者入门,同时也可供有经验的开发者回顾和复习Shell脚本编程的知识。通过学习这些内容,读者可以掌握Shell脚本的基本用法,并在实际项目中运用这些知识来完成自动化任务和系统管理工作。