shell编程入门(一天掌握shell编程)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、背景

到新公司之后发现好多地方需要使用shell来编写一些简单的程序来提升自己的工作效率因此专门B站上查看视频尚硅谷的视频在这里学习总结下shell编程。

二、shell概述

shell是一个命令行解释器它接收应用程序或用户的命令然后调用操作系统内核。
在这里插入图片描述
shell还是一个相当强大的编程语言易编写易调试灵活性强。

三、shell入门

1.脚本格式

脚本格式以#!/bin/bash开头指向解释器

2.第一个shell脚本helloworld.sh输出helloworld

在这里插入图片描述
在这里插入图片描述

3.执行方式

方式一sh 或 bash + 相对或绝对的文件路径不需要 +x
方式二直接输入脚本的相对或绝对路径需授可执行权限 +x
方式三在脚本的路径前面使用一个 . 或一个source 这种方式不同于以上2种以上两种运行时会嵌套子shell这个不会嵌套就在本环境运行开子shell与不开子shell的区别在于环境变量的继承关系如在子shell中设置的当前变量父shell中是不可见的

4.变量

- 4.1系统预定义变量

a.常用的系统变量这里大多数都是写全局的环境变量
$HOME、$PATH、$SHELL等、$PWD

- 4.2 自定义变量

a.基本语法
1定义变量变量名=变量值 注意=前后不能有空格
2撤销变量unset 变量名
3申明静态变量readonly 变量注意不能unset
b.变量定义的规则
1变量名称可以由字母、数字和下划线组成但是不能以数字开头环境变量名建议大写
2等号两侧不能有空格
3在bash中默认变量都是字符串类型无法直接进行数值运算。
4变量的值如果有空格需要使用双引号或者单引号给括起来。
c.案例实操
1下图中设置的变量时局部变量比如在当前环境设置后在子bash中就访问不到
在这里插入图片描述
2设置为全局变量
步骤1先设置局部变量
步骤2export 变量 注意思就是把父shell中的变量导出变成一个全局变量
注意子bash中更改的的全局变量只在子bash中有效退出子bash后无效
在这里插入图片描述

- 4.3特殊变量

a.位置参数$n
1基本语法
$n功能描述n为数字$0代表脚本名称$1-$9代表一到九个参数十以上的要用大括号包含${10}
2实操案例
在这里插入图片描述
b.参数个数$#
1基本语法
$#获取所有输入参数的个数常用于循环判断参数个数是否正确以及加强脚本的健壮性
2实操案例
在这里插入图片描述
c.获取参数$* 和 $@
1基本语法
$* 这个变量代表命令行中所有的参数 $*把所有的看成一个整体
$@这个变量代表命令行中所有的参数不过$@把每个参数区分对待
2案例实操
在这里插入图片描述
在这里插入图片描述

  • d.返回状态$?
    1基本语法
    $?最后一次执行命令的返回状态。如果这个变量的值为0证明上一个命令正确执行如果这个变量的值非0具体是哪个数由命令自己来决定则证明上一个命令执行不正确了。
    2案例实操
    在这里插入图片描述

5.运算符

1基本语法
$((运算式)) 或 $[运算式]
2案例实操
在这里插入图片描述

6.条件判断

1基本语法
a.test condition
b.[ condition ] 注意condition前后要有空格
注意1.条件非空返回true否则返回false2.记得加空格不然程序会认为是一个值
在这里插入图片描述
c.常用判断条件
1两个整数之间比较

  • -eq等于equal
  • -ne不等于not equal
  • -lt小于less than
  • -le小于等于less equal
  • -gt大于greater than
  • -ge大于等于greater equal
    注如果四字符串之间的比较用"=“判断相等用”!="判断不等
    2按照文件权限进行判断
  • -r有可读权限read
  • -w有可写权限write
  • -x有可执行权限execute
    3按照文件的类型进行判断
  • -e文件存在existence
  • -f文件存在且是一个常规的文件file
  • -d文件存在且是一个目录directory
    4多条件判断
  • &&表示前一个命令执行成功时才执行后一条命令
  • ||表示上一条命令失败后才执行下一条命令
  • -a即all同&&但是&&不能在 [] 中使用示例[ $age -gt 18 -a $age -lt 35 ]
  • -o即or同||但是||不能在 [] 中使用示例[ $age -gt 18 -o $age -lt 35 ]

[ … ] && … || … 其实就是if…else…语句了

d.案例实操
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.流程控制重点

- 7.1、if判断双分支的逻辑结构二叉树

a.基本语法
1单分支

if [ 条件判断式 ];then  #分号表示一行出现2步命令的实现
	程序
fi
#或者
if [ 条件判断式 ]
then
	程序
fi

2多分支

if [ 条件判断式 ]
then
	程序
elif [ 条件判断式 ]
then
	程序
else
	程序
fi

b.案例实操
在这里插入图片描述

- 7.2、case语句多分支的逻辑结构多叉树

a.基本语法
case $变量名 in
“值1”)
如果这个值等于值1则执行程序1
;;
“值2”)
如果这个值等于值2则执行程序2
;;
…省略其它分支…
)
如果变量的值都不是以上的值则执行此程序
;;
esac
注意事项
1case行尾必须为单词"in"每个模式必须以右括号")“结束。
2双分号”;;“表示命令序列结束相当于java中的break
3最后的”
"表示默认模式相当于java中的default
b.案例实操 在这里插入图片描述

- 7.3、for循环

a.基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

b.案例实操1
注意双小括号(( ))中就可以直接使用数学中的运算表达式如<=
在这里插入图片描述

c.基本语法2
for 变量 in 值1 值2 值3
do
程序
done
d.操作实例2
在这里插入图片描述
增强for循环
在这里插入图片描述

- 7.4、while循环条件判断循环

a.基本语法
while [ 条件判断式 ]
do
程序
done.
b.案例实操

在这里插入图片描述
另一种写法使用内嵌函数let

#!/bin/bash

a=1
while [ $a -le $1 ]; do
	# sum=$[$sum+$a]
	# a=$[$a+1]

	# 使用内嵌命令let实现类似其它语言中的写法
	let sum+=$a
	let a++
done

echo "$sum"

8.read读取控制台输入

a.基本语法
read (选项) (参数)
选项

  • -p指定读取值时的提示符
  • -t读取超时时间超时退出
    参数
  • 变量指定读取值的变量名
    b.按理实操
    在这里插入图片描述

9.函数

- 9.1、系统函数

- 9.1.1、basename

1基本语法
basename [string/pathname] [suffix] 功能描述basename命令会删掉所有前缀包括最后一个('/'字符)然后将字符显示出来
basename可以理解为获取路径里的文件名称
选项
suffix为后缀如果suffix被指定了basename会将pathname或string中的suffix去掉。
2案例实操
调用系统函数$(函数名 参数)
在这里插入图片描述
在这里插入图片描述

- 9.1.2、dirname

1基本语法

2案例实操
在这里插入图片描述
在这里插入图片描述

- 9.2、自定义函数

a.基本语法
[function] funname[()]
{
Actiion;
[return int;]
}
b.经验技巧

  1. 必须在调用之前先申明函数先申明函数shell脚本是逐行运行解释性语言。不会像其它语言一样先去编译。
  2. 函数返回值只能通过$?系统变量获得可以显示加return返回如果不加将以最后一条命令运行结果作为返回值。return后跟数值0-255

c.案例实操
在这里插入图片描述

10.综合应用案例-归档文件

#!/bin/bash

# 首先判断参数的个数是1
if [[ $# -ne 1 ]]; then
         echo "参数个数错误应该输入一个参数作为归档目录名。"
         exit
fi 

# 从参数中获取目录名称
if [[ -d $1 ]]; then
        echo
else
        echo "目录不存在"
        echo
        exit
fi


DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)

# 获取当前日期
DATE=$(date +%y%m%d)

# 定义生成文件的归档名称
FILE=test_${DIR_NAME}_$DATE.tar.gz
DEST=/home/jupiter/dongshuai/$FILE

echo "开始归档。。"
echo

tar -czf $DEST $DIR_PATH/$DIR_NAME

if [[ $? -eq 0 ]]; then
        echo 
        echo "归档成功"
        echo
        exit
else
        echo "归档出现问题"
        echo
fi

在这里插入图片描述
然后使用crontab可以定制执行
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell