shell 脚本练习

一、初识shell

文件描述符与重定向

0:标准输入

1:标准正确输出

2:标准错误输出

1>a.txt 与 >a.txt 一样,不写默认前面为1,省略,把标准输出重定向到a.txt中

2>a.txt  将错误输出重定向到a.txt中

&>a.txt  混合输出,将正确和错误的都输出到a.txt文件

注意:当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。

一般来说, "1>" 通常可以省略成 ">".
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,之前如果有定义标准错误重定向到某log文件,那么标准输出也重 定向到这个log文件,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道. nginx -V
例子. 当前目录下只有a.txt,没有b.txt

[root@redhat box]# ls a.txt b.txt 1>file.out 2>&1
[root@redhat box]# cat file.out
ls: b.txt: No such file or directory
a.txt


现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端 =================================
 

[root@redhat tmp]# cat >> b.txt <<!
> ni hao a hahafvs
>!
[root@redhat tmp]# cat b.txt
ni hao a haha

 补全   

 bash-completion   #增加补全

 //这个需要下载 yum -y install bash-completion  

 历史命令

history

查看历史命令:

        Ctrl +r 搜索关键字

        向上箭头

        esc+. 调用上一条历史命令的最后一个参数

给历史命令前面加上时间:

1.vim /etc/profile        //配置文件

        HISTIMEFORMAT=“%Y-%m-%d %H:%M:%S”

2.再次执行history查看结果
            source /etc/profile

 别名

alias 别名=‘df-h’        //临时修改,重启后失效

永久生效:

        vim /root/.bashrc //配置文件,将要修改的别名写进去

 前后台作业

1.将前台作业改为后台作业

(1)# sleep 3000

        Ctrl+z           //暂停

        bg % 加工作号

(2)

        sleep 1000 &

(3)   

        nohup sleep 1000 &

2.后台调到前台

        fg % 工作号

3.查看当前终端上有多少挂在后台的作业

        jobs         //终端断掉则不能查看

4.进程管理

        ps -ef         //列出所有进程

 快捷键

Ctrl+a         光标会回到行首

Ctrl +e         光标回到行尾

Ctrl+u         删除光标前面内容

Ctrl+k         删除光标后面内容

Ctrl+c         终止

Ctrl+l          清屏

Ctrl+d         登出

date时间  

date +%F           年月日

date +%T           时间

date+%u                星期

date+%d                日

date+%m                月份

date+%-m/^+%-d        9/9        去掉09的0

 管道        |

例如:查看本主机ip        3种方式都用到管道

#ifconfig | awk 'NR==2{print $2}'

# ip a | grep inet |grep brd |cut -d ' ' -f6|cut -d '/' -f1

# ip -f inet a show dev ens33 |awk 'NR==3 print{$2}' 

 命令排序执行

;         分隔开,互不影响

&&        上一条命令执行成功,才能执行下一条命令

||            上一条命令执行失败,才能执行下一条命令

二、shell 脚本规范

[root@newrain ~]# vim helloworld.sh   ---.sh代表这个文件是个shell脚本,第一个原因,让别人认的这个是shell脚本,sh后缀有高亮显示。
拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本

1. #!/usr/bin/env bash ---shebang蛇棒, 解释器, 翻译 2. #
3. #
3. # Author: newrain
4. # Email: newrain@163.com           ---这就是注释, 你没看错
5. # Github: https://github.com/newrain001
6. # Date: 2019/**/**
7. printf "hello world\n"功能说明:打印hello world
[root@newrain ~]# sh helloworld.sh
hello world
[root@newrain ~]# chmod +x helloworld.sh 
[root@newrain ~]# ./helloworld.sh 
[root@newrain tmp]# /tmp/helloworld.sh 
hello world


# 执行脚本方式
1、 sh 脚本.sh
2、 bash 脚本.sh
3、 ./脚本.sh  # 需要执行权限
4、 .  脚本.sh
5、 source 脚本.sh
第一行: “#!/usr/bin/env bash”叫做shebang, shell语法规定shell脚本文件第一行为整个文件的解释器
第二行: 为“#”开头的行为注释行默认不会被程序所读取, 用来说明文件及标定所属人员使用, 也可用来解释程序 第七行: 为格式化打印语句printf, printf可以把后面的“hello world”打印到指定的终端中, \n 为换行符

三、变量的类型

  • 变量

    • bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能

  • 预定义变量、环境变量、自定义变量、位置变量

预定义变量


$? 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这个变量的值为非 0 ,则 证明上一条命令执行错误
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

[root@newrain sh]# ls
count.sh hello.sh parameter2.sh parameter.sh  #ls命令正确执行
[root@newrain sh]# echo $?
0
#预定义变量"$?"的值是0,证明上一条命令正确执行

[root@newrain sh]# vim variable.sh 
#!/bin/bash
echo "The current process is $$" 
#输出当前进程的PID 
#这个PID就是variable.sh脚本执行时生成的进程的PID

[root@newrain sh]# sleep 3000 & 
[1] 12165 
#符号"&"的意思是把命令放入后台执行 
[root@newrain sh]# echo $!
12165

自定义变量

定义:变量名称=值

        变量名称:只能以字母,数字,下划线组成,不能以数字开头;

        注意:应该让变量名称有意义;
                = 赋值符号 前后不能有空格 ;
                值: 所有的字符串和数字都可以;

        引用变量:$变量名        或者         ${ 变量名 }

        示例:
            [root@newrain ~]# a=100
                [root@newrain ~]# echo $a
                100
                [root@newrain ~]# echo $aa
                                # 这里输出为空,因为解释器认为$aa是变量
                [root@newrain ~]# echo ${a}a
                100a

        查看变量:echo $变量名   set (所有变量:包括自定义变量和环境变量)

        取消变量:unset 变量名 仅在当前shell有效

        作用范围:仅在当前shell有效

环境变量

env   查看所有环境变量

set 查看所有变量 
                环境变量拥有可继承性:export之后就拥有继承性
        export 导出变量(作用范围) 
临时生效
    [root@newrain ~]# IPADDR=192.168.1.1
        [root@newrain ~]# echo $IPADDR
        192.168.1.1
永久生效
        写到4个登陆脚本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立独立的环境变量配置文件
        常用环境变量:USER UID HOME HOSTNAME PWD PS1 PATH
PATH:存储所有命令所在的路径

 练习1

编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下: 
    [root@tiger tmp]# ./test.sh
    2012年 05月 24日 星期四 17:07:45 CST
    当前的用户为 root
    当前用户的宿主目录为 /root 用户的标识为 0
    主机名称为 newrain
    网卡的IP地址为 192.168.1.106

#脚本源码

#!/bin/bash

获取主机的基本信息

time=`date +%y年%m月%d日-%H:%M:%S`

ip=`ifconfig eth0|grep inet|awk '{print $2}'` echo "现在的时间是:" $time

echo "当前的用户为:"$USER

echo "当前的用户标识:" $UID
echo "当前的主机名称是:" $HOSTNAME
echo "当前可用网卡IP是:" $ip

取根分区的剩余空间:df -h | awk 'NR==6{print $3}

取当前系统剩余内存:free -m | awk 'NR==2{print $4}

取当前cpu平均负载:

# echo 现在cpu的`uptime |cut -d, -f3-` //-d指定分隔符,-f指定显示区域,3-第三列以后(包括第三列)

现在cpu的 load average: 0.07, 0.12, 0.11
# echo 现在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`

现在cpu的 load average: 0.00 0.04 0.10

 练习二

位置变量
    $1 $2 $3 $... 
    #/test.sh start 
    #/test.sh 2 3 5 hello
    start是第1个位置参数 
        2 是第1个位置参数
        3 是第2个 依次类推
例子:
[root@newrain shell]# cat weizhi.sh 
#!/bin/bash
#...
echo 我的第一个位置参数是:$1 
echo 我的第二个位置参数是:$2 
echo 我的第三个位置参数是:$3 
echo 我的第四个位置参数是:$4 
echo 一共有 $# 个位置参数 
echo 你输入的参数分别是:$*

求出第一个参数和第二个参数的和
./5.sh 4 5
9
./5.sh 10 20 30
#!/bin/bash
# 求 $1 $2 的和 
x=${1:-0} 
y=${2:-0}
echo $(($x+$y))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547766.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在 CentOS 安装 Python3.7 (没有弯路)

下载Python源码包 wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz安装前准备 安装依赖组件 yum -y install wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel xz-devel解压安装 解…

【Redis】渐进式遍历 数据库管理命令 RESP协议

目录 渐进式遍历 scan 数据库管理命令 切换数据库 获取当前数据库key的个数 删除当前数据库所有的key 删除所有数据库中所有的key RESP协议 渐进式遍历 Redis使用scan命令进行渐进式遍历键&#xff0c;进而解决直接使用keys获取键时可能出现的阻塞问题&#xff08;因为…

ctf.show---->r3

做题笔记。 下载 查壳。 64ida打开。 先运行一下&#xff1a; &#xff1f; 不是说4位数值么。。。 得&#xff0c;看ida。 __isoc99_sscanf(dest, "%x", &v5); 懂了 dest指向的是v5 ,那么dest怎么来的&#xff1a; 往上走&#xff1a; 通过strncpy得到 但是问题…

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine&#xff08;加载外部的.class文件&#xff0c;redefine到JVM里 &#xff09;举例1&#xff1a;加载新的代码&#xff0c;jad/mc 命令使用举例2&#xff1a;上传 .class 文件到服务器的技巧 二、命令列表 2.…

WEB服务器——Tomcat

服务器是可以使用java完成编写&#xff0c;是可以接受页面发送的请求和响应数据给前端浏览器的&#xff0c;而在开发中真正用到的Web服务器&#xff0c;我们不会自己写的&#xff0c;都是使用目前比较流行的web服务器。 如&#xff1a;Tomcat 1. 简介 Tomcat 是一个开源的轻量…

汽车总线之---- LIN总线

Introduction LIN总线的简介&#xff0c;对于传统的这种点对点的连接方式&#xff0c;我们可以看到ECU相关的传感器和执行器是直接连接到ECU的&#xff0c;当传感器和执行器的数量较少时&#xff0c;这样的连接方式是能满足要求的&#xff0c;但是随着汽车电控功能数量的不断增…

Vue下载静态文件

1、需求&#xff1a;将静态文件放在本地&#xff0c;让用户进行下载。 2、文件位置&#xff1a; ① 原生js&#xff1a;直接将文件放在某个目录或者根目录下 ② Vue&#xff1a;将文件放在根目录的public文件夹下面 3、代码示例&#xff1a; const url "/模板.xlsx"…

Halcon实用系列1-识别二维条码

在做项目时&#xff0c;之前使用的是某康的智能读码器&#xff0c;综合考虑成本&#xff0c;可通过相机拍照来读取图片的二维码&#xff0c;我这边用Halcon来实现。 Halcon代码如下&#xff1a; *创建模型 create_data_code_2d_model(Data Matrix ECC 200, [], [], DataCodeH…

linux蓝屏重启解决方法汇总

前言 linux系统蓝屏&#xff08;Blue Screen Of Death&#xff09;是Linux系统用户遇到最严重的故障&#xff0c;任何新手都无法直接解决它。在遇到蓝屏时&#xff0c;最好的解决方案是联系Linux专业供应商或Linux专业支持工程师&#xff0c;因为他们有系统的协议和经验来解决…

dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)

文章目录 1、docker部署Mysql2、dockerfile构建镜像1.1、在idea中导入课件中的项目资料\day01\ebuy-docker1.2、修改项目application.yml数据库连接参数1.3、启动项目访问测试&#xff1a;http://localhost:8081/1.4、执行mvn package命令进行项目打包1.5、虚拟机中新建目录/op…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析&#xff0c;如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储&#xff08;也会涉及收费问题&#xff09;&#xff0c;通过组态软件…

NDI多画面系统(Multiview Pro)

NDI多画面系统(Multiview Pro)是千视以Multiview Player为基础打造的一款全新的多画面监看切换系统,支持自定义多画面/多窗口显示,单窗口可监看20路视频流,可实现多窗口、多屏幕预监+切换,且兼容NDI High Bandwidth和NDI HX/NDI HX3。同时Multiview Pro基于WebRTC技术,可…

用 Git Absorb 轻松管理 commit,告别频繁 fixup,效率提升 10 倍!

你是不是经常在使用 Git 的时候被频繁的 commit --fixup 弄得头疼?尤其是在修复代码时,一个小改动就得新建一个 commit,搞得整个 commit 历史乱七八糟,不仅影响工作效率,后来要查找问题时也变得更复杂。如果你对这个问题深有感触,那么这篇文章就是为你写的。 今天我想…

JVM 类加载机制2

扩展类加载器&#xff08;Extension ClassLoader&#xff09;&#xff0c;该类加载器是由 ExtClassLoader&#xff08;sun.misc.Launcher$ExtClassLoader&#xff09;实现&#xff0c;负责将 <JRE_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载…

open-resty 服务安装kafka插件

从github下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2023/11/16 22:01 lua-resty-kafka 插件安装 下载代码后直接解压 mkdir -p /usr/local/openresty/modules/ #创建一个目录&#xff0c;存放lua插件cd /usr/local/openresty/modules/ #进入目录rz -y #上传lua插件…

SOMEIP_ETS_136: SD_Option_Length_shorter_GT_0_as_specified_for_type

测试目的&#xff1a; 验证DUT能够处理一个UDP选项长度小于其类型所指定长度的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应或完全忽略该请求。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个UDP选项长度小于其类型所指定…

WPS在表格中填写材料时,内容过多导致表格不换页,其余内容无法正常显示 以及 内容过多,导致表格换页——解决方法

一、现象 1&#xff0c;内容过多导致表格不换页&#xff0c;其余内容无法正常显示 2&#xff0c;内容过多&#xff0c;导致表格换页 二、解决方法 在表格内右击&#xff0c;选择表格属性 在菜单栏选择行&#xff0c;勾选允许跨页断行&#xff0c;点击确定即可 1&#xff0…

windows安装Redis以后配置远程访问

修改配置文件&#xff1a; 第一个地方&#xff1a; 第二个地方&#xff1a; 启动服务&#xff1a; redis-server .\redis.windows.conf 可能需要重启计算机 经过实测&#xff0c;这个配置文件也得改&#xff1a; 如果不想重启计算机&#xff0c;可以执行下面的命令重启…

代码随想录冲冲冲 Day56 图论Part8

117. 软件构建 这道题是使用拓扑排序的方法 看多个任务有优先级的情况下 怎么排序 对应到这道题就是文件排序 首先要记录每一个点的入度&#xff0c;当一个点的入度为0时&#xff0c;就说明这个点是顶点 然后记录每一个点向那些点相连 之后建立一个queue 寻找一个入度为0的…

基于quill2.0的富文本编辑器,Fluent Editor,支持表格,图片,表情等

官网&#xff1a;Fluent Editor | 基于 Quill 2.0 的富文本编辑器 安装 npm i opentiny/fluent-editor quill 使用案例 <template><div class"publish-form-container"><!-- TODO --><div ref"quillEditorRef" class"quill…