当前位置: 首页 > article >正文

【shell】

shell

  • 一、shell简介
  • 二、shell脚本的执行方式
  • 三、shell变量
    • 3.1 shell变量介绍
    • 3.2 shell变量的定义
      • 3.1.1 基本语法
      • 3.2.2 定义变量的规则
      • 3.2.3 将命令的返回值赋予变量
  • 四、环境变量的设置
    • 4.1 基本语法:
  • 五、位置参数变量
    • 5.1 基本介绍
    • 5.2 基本语法
  • 六、预定义变量
    • 6.1 基本介绍
    • 6.2 基本语法
  • 七、运算符
  • 九、流程控制
    • 9.1 if 条件判断
    • 9.2 常用判断条件:
    • 9.3 case语句
    • 9.4 for循环
    • 9.5 while循环
    • 9.6 read读取控制台输入
      • 9.6.1 基本语法:read [选项] [参数]
      • 9.6.2 用法:
      • 9.6.3 参数说明:
      • 9.7.4 .参数解读实例:
        • 9.7.4.1 -a 参数
        • 9.7.4.2 -d
        • 9.7.4.3 -p
        • 9.7.4.4 -n
        • 9.7.4.5 -r
        • 9.7.4.6 -s
        • 9.7.4.7 -t
        • 9.7.4.8 -u
  • 十、shell函数
    • 10.1 系统函数
      • 10.1.1 basename函数
      • 10.1.2 dirname函数
    • 10.2 自定义函数
  • 十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式
    • 11.1 fork
    • 11.2 exec
    • 11.3 source
  • 十二、等待.sh脚本仅在另一个脚本完成后才能运行?
    • 12.1 &&连接器
    • 12.2 连接器

一、shell简介

shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。

二、shell脚本的执行方式

1.脚本以#!/bin/bash开头
2.脚本需要有可执行权限

三、shell变量

3.1 shell变量介绍

1.Linux shell中的变量分为系统变量和用户自定义变量
2.系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等
3.显示当前shell中的所有变量:set

3.2 shell变量的定义

3.1.1 基本语法

1.定义变量:变量=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量(静态变量声明后不能撤销)
4.多行注释的写法::<<! txt !(开头和结尾都单独一行)

3.2.2 定义变量的规则

1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头
2.等号两侧不能有空格.
3.变量名称一般习惯为大写.

3.2.3 将命令的返回值赋予变量

1.A=‘date’反引号,运行里面的命令,并把结果返回给变量A
2.A=$(date)等价于反引号

四、环境变量的设置

4.1 基本语法:

1.export 变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
2.source 配置文件(功能描述:让修改后的配置信息立即生效)
3.echo $变量名(功能描述:查询环境变量的值)

五、位置参数变量

5.1 基本介绍

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。

5.2 基本语法

$n(功能描述:n为数字,$0代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10})
∗ (功能描述:这个变量代表命令行中所有的参数, *(功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有的参数个数)

六、预定义变量

6.1 基本介绍

shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。

6.2 基本语法

$$ (功能描述:当前进程的进程号(PID))
$!(功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

七、运算符

基本语法:
1. ( ( 运算符 ) ) 或者 ((运算符))或者 ((运算符))或者[运算式]或者expr m + n
2.注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用反引号或者$
3.expr *,/,%分布代表乘,除,取余

九、流程控制

9.1 if 条件判断

基本语法:(注意condition前后要有空格)

if [ condition ]
then 语句
elif
then 语句
fi

9.2 常用判断条件:

字符串比较(=)
两个整数的比较
	-lt(小于)                    //less than   小于
	-le(小于等于)            // 
	-eq(等于)                  //equal  等于
	-gt(大于)                   //greater than 大于
	-ge(大于等于)          //
	-ne(不等于)              //
按照文件权限进行判断
	-r (有读的权限)
	-w (有写的权限)
	-x(有执行的权限)
按照文件类型进行判断
	-f (文件存在并且是一个常规文件)
	-e(文件存在)
	-d(文件存在并是一个目录)

9.3 case语句

case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

9.4 for循环

基本语法1for 变量 in 值123...
do
程序
done

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

9.5 while循环

while [ 条件判断式 ]
do
程序
done

在这里插入图片描述

9.6 read读取控制台输入

9.6.1 基本语法:read [选项] [参数]

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。

9.6.2 用法:

  • 用于从标准输入读取数据(键盘)
  • 也可以从文件中读取(此时是读取一行文件)
    read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name…]

9.6.3 参数说明:

  • -a 后面跟一个变量,该变量会被认为为数组,然后给其复制,默认是以空格为分隔符
  • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
  • -p 后面跟提示信息,即在输入前面打印提示信息
  • -e 在输入的时候可以使用,命令补全功能
  • -n 后面跟一个数字,定义输入文本的长度,很实用
  • -r 屏蔽\,若没有该选项,则\作为一个转义字符,有的话反斜杠就是个正常的字符了。
  • -s 安静模式,在输入字符时不再屏幕上面显示(常用于输入密码)
  • -t 后面跟秒数,定义输入字符的等待时间
  • -u 后面跟fd,从文件描述符中读取,该文件描述符可以是exec新开启的

9.7.4 .参数解读实例:

9.7.4.1 -a 参数
  • 从键盘读取一组数据进行四则运算
    read -a score #读取三个元素进入score数组
    echo ${score[@]} #挨个输出score数组中的元素,不换行

  • 输出结果
    输入:11 12 13
    输出:11 12 13

9.7.4.2 -d
  • 限定读取到那一个字符停止读取,比如下面就是限定读取到字符s,只有第一个字符重要
    read -d sscsc v
    echo -e “\n”
    echo $v
9.7.4.3 -p
  • -p选项是为了显示提示信息
    read -p “请输入你的密码:” passward
    echo $passward

  • 结果
    $ bash 1.sh
    请输入你的密码:1234567
    1234567

9.7.4.4 -n
  • 定义输入密码的长度为8
    read -n8 -p “请输入你的密码:” passward #控制密码的
    echo -e “\n”
    echo -e $passward
  • 输出结果
    请输入你的密码:12345678
    12345678
9.7.4.5 -r
  • 读取一段字符串 123adda\ncsdd
    read -r -p “请输入字符串” str
    echo -e “\n”
    echo $str

  • 输出结果
    请输入字符串123adda\ncsdd

123adda\ncsdd

9.7.4.6 -s
  • 这个选项常和-p一起使用
    read -p “请输如你的密码:” -s -n8 passward
    echo -e “\n密码”
    echo $passward

  • 输出结果
    请输如你的密码:
    密码
    12345678

9.7.4.7 -t
  • 指定输入字符的等待时间就好像那些输入验证码的程序,输错了第次就要等待时间再次进行输入
9.7.4.8 -u
  • 创建两个文件1.txt,2.txt,然后拼接两个文件的第三行和第四行
    $ cat 1.xtxt
    a
    b
    c
    d
    $ cat 2.txt
    1
    2
    3
    4

while read -u2 i && read -u3 j
do
echo $i $j
done 2<1.txt 3<2.txt

  • 输出结果
    a 1
    b 2
    c 3
    d 4

十、shell函数

10.1 系统函数

10.1.1 basename函数

功能:返回完整路径最后/的部分,常用于获取文件名
基本语法:basename [pathname] [suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来)。
选项:suffix为后缀,如果被指定,basename会将pathname中的suffix去掉。

10.1.2 dirname函数

功能:返回完整路径最后/前面的部分,常用于返回路径部分。
基本语法:dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

10.2 自定义函数

[ function ] funcname()
{
Action;
[return int;]
}

十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式

11.1 fork

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。

11.2 exec

exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.

11.3 source

与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。

十二、等待.sh脚本仅在另一个脚本完成后才能运行?

12.1 &&连接器

只需使用&&连接器(即复合命令):
./script1.sh && ./script2.sh
1
但是请注意,只有script1.sh 即第一个脚本退出代码为0(即没有错误)时,才会执行第二个脚本。

12.2 连接器

如果要执行序列,无论第一个脚本的结果如何,只需执行以下操作
./script1.sh ; ./script2.sh

您可以测试两个连接器的行为:
$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa


http://www.kler.cn/news/157183.html

相关文章:

  • 华为云购买参考:到底选购ECS还是CCE?
  • STL常用算法-C++
  • acwing1209.带分数暴力与优化(java版)
  • python pyaudio 录取语音数据
  • 【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁
  • Java 设计模式——备忘录模式
  • docker compose 搭建reids集群 1主2从架构
  • 【C语言】递归详解
  • 【powerjob】定时任务调度器 xxl-job和powerjob对比
  • SQL Sever 基础知识 - 数据筛选(2)
  • PCB走线要“尽量”短_笔记
  • 【数据库设计和SQL基础语法】--SQL语言概述--数据类型和约束
  • 基础堆溢出原理与DWORD SHOOT实现
  • MySQL笔记-第04章_运算符
  • Gson 自动生成适配器插件
  • cocos creator-碰撞检测
  • STM32串口接收不定长数据(空闲中断+DMA)
  • 调试GMS应用,报错“此设备未获得play保护机制认证”问题解决
  • 马斯克极简5步工作法 —— 筑梦之路
  • 大数据技术学习笔记(四)—— HDFS
  • Java生成word[doc格式转docx]
  • 【开源】基于JAVA的天然气工程运维系统
  • ffmpeg学习日记619-指令-透明通道视频相关指令
  • Cpp之旅(学习笔记)第9章 标准库
  • Ant Design Pro初始化报错
  • 为什么要做ERP集成?ERP系统如何与其他业务应用程序集成
  • 装箱 Box 数据类型
  • Metasploit的网络流量分析和嗅探
  • SQL手工注入漏洞测试(PostgreSQL数据库)-墨者
  • 面试官:说说synchronized与ReentrantLock的区别