SHELL脚本学习笔记
创建可执行的 SHELL 脚本
touch shell.sh
chmod +x shell.sh # 授权:可执行
内建函数
# 打印
echo
# 不换行打印
echo -n
变量
# 变量命名规范:字母、数字和下划线
# 取变量值: ${variable_name} 或者 $variable_name
# 获取命令结果的值:$(command_name) 或者 command_name
# 定义只读变量 readonly variable_name
# 删除变量(不能删除只读变量):unset variable_name
# SHELL变量作用域:局部变量、全局变量、环境变
SHELL 特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n (n>=1) | 传递给脚本或者函数的参数。n 表示第一个参数,${10}… |
$# | 传递给脚本或者函数的参数个数 |
$* | 传递给脚本或者函数的所有参数 |
$@ | 传递给脚本或者函数的所有参数, |
$? | 上个命令的退出状态,或者函数返回值 |
$$ | 当前SHELL脚本进程 ID |
当它们被双引号" "包含时,就会有区别了:
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
函数定义
# 函数定义
# 定义 Shell 函数时不能带参数
# function fun_name () {#方法体}
# 调用 fun_name param1 param2
# Shell位置参数(命令行参数) $1 ... ${10}
字符串
获取字符串长度:${#string_name}
字符串拼接:将两个字符串并排放在一起就能实现拼接
字符串截取
格式 | 说明 |
---|---|
${string: start :length} | 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 |
${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后。 |
${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 |
${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后。 |
${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string%*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 |
${string%%*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 |
数组
数组的定义
SHELL 中数组的长度不是固定的
array_name=(ele1 ele2 ... elen)
获取数组元素
# 获取数组某个元素
${array_name[index]}
# 获取数组所有元素
${array_name[*]} 或者 ${array_name[@]}
# 获取数组长度
${#array_name[*]} 或者 ${#array_name[@]}
数组拼接
拼接数组的思路是:先利用
@
或*
,将数组扩展成列表,然后再合并到一起。具体格式如下:array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
删除数组元素
# 删除数组某个元素
unset array_name[index]
# 删除数组
unset array_name
IF 语法
条件测试类型:
整数测试
字符测试
文件测试
一、条件测试的表达式:
[ expression ] 括号两端必须要有空格
[[ expression ]] 括号两端必须要有空格
test expression
组合测试条件:
-a: and
-o: or
!: 非
二、整数比较:
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或等于
-le 小于或等于
命令间的逻辑关系
逻辑与:&&
第一个条件为假 第二个条件不用在判断,最总结果已经有
第一个条件为真,第二个条件必须得判断
逻辑或:||
三、字符串比较
== 等于 两边要有空格
!= 不等
> 大于
< 小于
四、文件测试
-z string 测试指定字符是否为空,空着真,非空为假
-n string 测试指定字符串是否为不空,空为假 非空为真
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是都可执行
-z 是否为空 为空则为真
-a 是否不空
五、if语法
if 判断条件 0为真 其他都为假
语法结构
# 单分支 IF 语句
if 判断条件 ; then
语句
fi
# 双分支 IF 语句
if 判断条件 ; then
语句1
else
语句2
fi
#
if 判断条件 ; then
语句1
elif 判断条件; then
语句2
else
语句3
fi
SHELL 方法
文件及文件夹
获取当前工作目录
# 1、dirname $0,取得当前执行的脚本文件的父目录
# 2、cd到父目录,即进入当前工作目录
# 3、pwd显示当前工作目录
workdir=$(cd $(dirname $0); pwd)
写入文件
# 覆盖写入
echo 要写入内容 > 文件名
# 追加写入
echo 要写入内容 >> 文件名
判断文件或者文件夹是否存在
获取某个文件夹下所有文件
# 获取 ls *,并遍历
cd 目标文件夹
for file in $(ls *)
do
echo $file
done
WGET
命令
# 下载单个文件
wget 下载地址
# 将下载的文件存放到指定的文件夹下,同时重命名下载的文件
wget -O 路径/新命名 下载地址
# 下载多个文件 1.创建一个文件,用于存储要下载文件的链接,每行一个链接 2.执行命令
wget -i 填写下载链接的文件
如何判断 WGET 命令是否下载完成
# $? 获取上个命令结果或者函数返回值,来判断
#! /bin/bash
wget 下载地址
if [ $? -eq 0 ]; then
echo "download success"
else
echo "download faile"
fi