SHELL脚本学习笔记

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

你可能感兴趣的:(Linux)