shell编程入门(一天掌握shell编程)-程序员宅基地

技术标签: linux  bash  开发语言  

一、背景

到新公司之后,发现好多地方需要使用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:先设置局部变量
步骤2:export 变量 注:意思就是把父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,否则返回false;2.记得加空格,不然程序会认为是一个值
在这里插入图片描述
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
注意事项:
(1)case行尾必须为单词"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可以定制执行
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44663072/article/details/124766737

智能推荐

Python的__new__方法_python new-程序员宅基地

文章浏览阅读751次。Python的__new__方法Python的__new__和__init__的区别先看一段代码#-*- coding:utf8 -*-""">>> A()new init<__main__.A object at 0x02473A30>"""class A(object): def __init__(self): pri_python new

python的input和while循环_python while input-程序员宅基地

文章浏览阅读455次。python的input和while使用一、Python input()函数:获取用户输入的字符串Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。Python2.x 中 input() 相等于 eval(raw_input(prompt)),用来获取控制台的输入。raw_input() 将所有输入作为字符串看待,返回字符串类型。而 ..._python while input

java method getdeclaredmethod,带有类类型的Java反射getDeclaredMethod()-程序员宅基地

文章浏览阅读243次。I'm trying to understand Java reflecton and am encountering difficulties when working with non-Integer setter methods.As an example, how can I resolve the "getDeclaredMethod()" call below?import java...._aclass.getdeclaredmethod

MySQL8.0.17 安装及配置_rpm安装mysql8.0.17 如何设置端口-程序员宅基地

文章浏览阅读876次。MySQL8.0.17 安装及配置1. 下载2. MySQL配置2.1 初始化2.2 配置环境变量2.3 安装2.4 修改密码1. 下载官网下载:https://dev.mysql.com/downloads/mysql/选择适合自己的版本,下载完成后解压到自己的文件夹下。2. MySQL配置2.1 初始化解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my..._rpm安装mysql8.0.17 如何设置端口

Spring Security教程(9)---- 自定义AccessDeniedHandler_accessdeniedhandler是干嘛的-程序员宅基地

文章浏览阅读2.9w次,点赞10次,收藏7次。在Spring默认的AccessDeniedHandler中只有对页面请求的处理,而没有对Ajax的处理。而在项目开发是Ajax又是我们要常用的技术,所以我们可以通过自定义AccessDeniedHandler来处理Ajax请求。我们在Spring默认的AccessDeniedHandlerImpl上稍作修改就可以了。public class DefaultAccessDeniedHandle_accessdeniedhandler是干嘛的

Timeout of 60000ms expired before the position for partition could be determined踩坑flink消费kafka2.3.0_timeout of 6000ms steam 解决-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏10次。flink消费kafka2.3.0,时报错,分区分配的不对Kafka Client Timeout of 60000ms expired before the position for partition could be determined在网上找了一波,没找到原因,后面,误打误撞,发现,是因为,kafka的配置文件,server.properties,使用了主机名作为配置,在server.properties中添加host.name=192.168.0.30 (当前所在服务器的i._timeout of 6000ms steam 解决

随便推点

渗透测试——信息收集之JSFinder的使用_如何在kali中安装jsfinder-程序员宅基地

文章浏览阅读3.1k次。文章目录前言一、使用注意事项二、使用步骤1.下载后可以放入Kali里面通过Python运行。2.运行JSFinder.py总结前言JSFinder可以通过爬取网站各个页面的JS文件从而获得其中包含的网站的子域名,非常的好用,下面介绍JSFinder的使用方法,文章后面会给出JSFinder的下载地址。一、使用注意事项下载后通过命令行去直接执行,前提是Kali安装了python3及以上的版本,否则不行。二、使用步骤1.下载后可以放入Kali里面通过Python运行。2.运行JSF.._如何在kali中安装jsfinder

CausalVAE: Disentangled Representation Learning via Neural Structural Causal Models_yang, m., liu, f., chen, z., shen, x., hao, j., wa-程序员宅基地

文章浏览阅读692次。文章目录概主要内容模型ELBO关于AAAYang M., Liu F., Chen Z., Shen X., Hao J. and Wang J. CausalVAE: disentangled representation learning via neural structural causal models. arXiv preprint arXiv:2004.086975, 2020.概隐变量的因果表示.主要内容我们通常希望隐变量zzz能够表示一些特别的特征, 通过改变zzz使得生成的_yang, m., liu, f., chen, z., shen, x., hao, j., wang, j. causalvae: disentan

curl中的坑_curl 弊端-程序员宅基地

文章浏览阅读284次。问题:用curl方法向远端服务器发请求,如果成功,远端服务器会返回数据,对方要求用application/x-www-form-urlencode的请求头传输请求参数的数据。一开始用的是:$header = array();header[]=′application/x−www−form−urlencode′;curlsetopt(header[] = &#x27;applicatio..._curl 弊端

读书笔记:关于wsgi、web框架和模板的总结(python)_webinfo.wsgi模板文件-程序员宅基地

文章浏览阅读795次。在后台,Http服务器做的工作就是获取http请求,解析请求,用html文件作为body部分做http响应。wsgi的定义很简单,就是要求web应用开发者实现一个函数来响应Http请求。wsgi对于web应用开发者,屏蔽了http请求、解析,使其可专注于html文件的动态生成等业务逻辑。常用的静态服务器软件Apache、Nginx、Lighttpd等,python内置了一个wsg服务器,作为开发用_webinfo.wsgi模板文件

PAT乙级真题 1010 一元多项式求导 C++实现_pat一元多项式求导 c++-程序员宅基地

文章浏览阅读266次。题目设计函数求一元多项式的导数。输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。输入样例:3 4 -5 2 6 1 -2 0输出样例:12 3 -10 1 6 ..._pat一元多项式求导 c++

【SLAM】Ubuntu16.04下配置ORB-SLAM2_ubuntu16.04安装配置orb-slam2-程序员宅基地

文章浏览阅读2.4w次,点赞19次,收藏163次。本文记录了 ORB-SLAM2 在Ubuntu16.04下的安装过程._ubuntu16.04安装配置orb-slam2