shell脚本概述:
Linux shell脚本是一种在Linux和Unix系统中使用的脚本语言,它允许用户通过编写脚本来自动化任务和执行命令序列。Shell脚本通常使用Bourne Shell(sh)或Bourne Again Shell(bash)编写,但也可以适用于其他shell,如ksh、zsh等。
1. 定义和用途
- 定义:Shell脚本是由一系列的命令组成的文本文件,这些命令可以被Shell顺序执行。
- 用途:自动化系统管理任务、文件操作、程序编译、文本处理、日志分析等。
2. Shell类型
- Bourne Shell(sh):最初的Unix shell。
- Bourne Again Shell(bash):sh的增强版,是大多数Linux发行版的默认shell。
- C Shell(csh):提供类似C语言的语法。
- Korn Shell(ksh):提供与sh的兼容性和额外的功能。
- Z Shell(zsh):提供ksh的兼容性,以及许多增强功能。
脚本基本语法元素
-
Shebang行:
- 脚本通常以shebang行开始,指定解释器的路径:
-
#!/bin/bash
-
变量:
- 在Shell中,变量的作用域是全局的,除非使用局部变量声明
- shell变量不支持数据类型,他将任意赋值给变量的数据当作字符串识别
-
1.变量类型
-
局部变量:在脚本或函数中定义,只在当前脚本或函数中有效。
- 环境变量:对系统上的所有程序都可见,包括脚本。通常在
/etc/profile
或~/.bashrc
等配置文件中设置。 - 特殊变量:
$0
:脚本的名称。$1
、$2
、...:传递给脚本的参数。$1
是第一个参数,依此类推。$#
:传递给脚本的参数个数。$*
:所有参数列表,将所有参数看作一个整体。$@
:所有参数列表,将每个参数区分开来。$?
:上一个命令的退出状态码。-
2.定义变量:
- 使用等号
=
来定义变量,不需要在变量名和等号之间加空格 -
variable_name="value"
-
3.使用变量:
-
echo $variable_name
-
注释:
- 以
#
开头的行被视为注释: -
# 这是一个注释
-
命令:
- 直接写在脚本中,按顺序执行。
-
直接在脚本中编写命令,就像在终端中一样:
-
ls -l
-
功能性语句:
-
1.read [选项] [变量...]
-
参数说明:
选项
:可以用于控制read
命令的行为,如设置分隔符、限制输入长度等。变量
:一个或多个变量名,用于存储输入的数据。如果未指定变量名,输入的数据将被存储在默认变量REPLY
中。- 常用选项:
-s
:隐藏输入,用于输入密码或其他敏感信息。-a array
:将输入的单词读取到数组中。-d delimiter
:设置输入的定界符,默认为空格。-n N
:读取 N 个字符。-p prompt
:在读取之前显示提示信息。-u N
:从文件描述符 N 中读取数据。-
注意事项:
- 如果没有指定变量,
read
将使用默认变量REPLY
。 - 使用
read
读取时,输入的空格默认作为分隔符,除非使用-d
选项指定了其他定界符。 read
命令在遇到定界符或行尾时停止读取。- 在脚本中使用
read
可以方便地实现与用户的交互。 -
2.算数运算(expr)
- 用于执行简单的算术运算和字符串操作
- 格式1:expr 第一个操作数 运算符 第二个操作数
- 格式2:((expression))
-
#!/bin/bash # 算术运算 sum=$(expr 3 + 5) echo "Sum: $sum"
-
3.test
- 格式1:test expression
- 格式2:
[ expression ]
-
注意事项:
-
若是用到=,=两边要有空格
- 在使用方括号
[[ ... ]]
时,内部的条件表达式可以更复杂,支持模式匹配和正则表达式。 - 引号
"
用于确保变量替换时字符串不被拆分。 - 某些条件运算符(如
-a
和-o
)在[[ ... ]]
中使用时不需要转义。 - 使用
test
或[[ ... ]]
可以避免调用外部程序,这在脚本编写中是推荐的做法。 -
对整数:
-
对字符串:
-
对文件:
test
是Shell脚本中实现条件判断的重要工具,它提供了一种灵活的方式来评估各种表达式和条件。
-
数组
-
Shell数组允许你在Shell脚本中存储多个值,并在需要时引用它们。与传统编程语言中的数组不同,Shell数组有两种主要形式:一维数组和关联数组(在某些Shell中,如bash)。
-
一维数组:
-
一维数组在Shell脚本中是通过空格分隔的字符串列表。以下是一维数组的基本操作:
-
1.定义一维数组(shell数组中元素的类型可以不一样)
-
array=(element1 element2 element3 ...)
-
2.访问数组元素:
-
使用下标访问数组元素,下标从0开始:
echo ${array[0]} # 输出第一个元素 echo ${array[1]} # 输出第二个元素
-
3.获取数组长度:
-
shell没有内置的方法来直接获取数组长度,但可以通过以下方法计算:
-
length=${#array[@]} echo $length # 输出数组元素的数量
-
4.遍历数组
-
使用循环遍历数组的所有元素:
-
for element in "${array[@]}"; do echo $element done
-
5.增添元素
- 对数组元素的增加,直接使用 数组名[下标]=数值
-
$array[i]=value
-
6.删除元素
- 使用unset,格式为 unset 数组名[下标],如果不带下标,则删除数组的全部元素
-
示例代码
-
#!/bin/bash # 一维数组示例 numbers=(1 2 3 4 5) echo "第一个数字是: ${numbers[0]}" # 获取一维数组长度 length=${#numbers[@]} echo "数组长度是: $length" # 遍历一维数组 for num in "${numbers[@]}"; do echo $num done
-
关联数组(bash 4.0+)
- shell中还提供了一种关联性数组,在使用关联数组前,必须先使用 declare -A 进行声明
-
关联数组允许使用键值对存储数据,而不是简单的索引。
-
1.定义关联数组
-
使用`declare -A`关键字定义关联数组:
-
declare -A assoc_array
-
2.添加元素到关联数组
-
assoc_array[key]=value
-
3.访问关联数组元素
-
使用键来访问关联数组的元素:
-
echo ${assoc_array[key]}
-
4.获取关联数组的长度
-
获取关联数组中的键的数量:
-
length=${#assoc_array[@]} echo $length # 输出关联数组中的键的数量
-
5.遍历关联数组
-
遍历关联数组的键和值:
-
for key in "${!assoc_array[@]}"; do echo "$key: ${assoc_array[$key]}" done
示例代码:
-
# 关联数组示例 declare -A person person[name]="Alice" person[age]=30 # 访问关联数组元素 echo "名字: ${person[name]}" echo "年龄: ${person[age]}" # 遍历关联数组 for key in "${!person[@]}"; do echo "$key: ${person[$key]}" done
-
Shell数组是处理多个值的强大工具,可以在脚本中用于各种任务,如数据存储、循环处理等。
-
流程控制
- -a 且的关系连接多个表达式
- -o 或的关系连接多个表达式
-
if语句:
-
if [ 表达式1 ] then 命令块1 elif [ 表达式2 ] then 命令块2 elif [ 表达式n ] then 命令块n else 命令块other fi
-
示例代码
-
#!/bin/bash # 检查变量是否为空 if [ -z "$var" ] then echo "var is empty" elif [ -n "$var" ] then echo "var is not empty" else echo "This else clause will never be executed" fi
-
case语句:
-
case 字符串变量 in 模式1) 命令列表1 ;; 模式2) 命令列表2 ;; 模式3) 命令列表3 ;; *) 命令列表n esac
- 功能:找到字符串变量匹配的模式,并执行对应的命令列表。若所有模式都不匹配,则默认执行 *中的命令列表n。
-
循环语句
-
for循环:
-
for variable in list do # 命令 done
-
while循环:
-
while [ condition ] do # 命令 done
-
until循环:
-
until [ condition ]; do echo "Looping" done
-
函数:
- 函数是一组可以重复使用的命令序列。使用函数可以提高脚本的组织性、可读性和可维护性
-
1.函数定义:
-
格式一:function 函数名() { 命令1 命令2 ... } 格式二:函数名() { 命令1 命令2 ... }
-
2.函数调用:
- 方法1:通过$?获得函数的返回值
- 函数名 参数1 参数2$? 获得return返回值
- 方法2:通过echo来获得函数的结果
- 变量=`函数名 参数1 参数2`
- 注意:此种方法是函数中的内容是通过echo输出,把echo输出的内容保存在变量中
-
示例代码:
-
#!/bin/bash # 全局变量 global_var="I'm global" my_function() { # 局部变量 local local_var="I'm local" echo "Inside function: $local_var" echo "Inside function: $global_var" } my_function echo "Outside function: $global_var"
-
输入和输出重定向
-
使用
>
、<
、>>
、2>
等来重定向输入和输出: -
echo "Hello" > file.txt # 输出到文件 cat < file.txt # 从文件读取
-
管道
-
使用管道
|
将一个命令的输出连接到另一个命令的输入: -
ls | grep "pattern"
-
shell脚本的运行方式
-
方式一
-
示例代码:1. test_02.sh1、建立XX.sh文件
-
2、赋予shelll文件执行权限
-
3、执行shell文件 ./XX.sh
-
方式二
-
1、建立XX.sh文件
-
2、赋予shelll文件执行权限
-
3、bash + XX.sh