Linux之Shell(一)

Linux之Shell

  • Shell概述
    • Linux提供的Shell解析器
    • bash和sh的关系
    • Centos默认的解析器是bash
  • Shell脚本入门
    • 脚本格式
    • 第一个脚本
    • 脚本常用的执行方式
  • 变量
    • 系统预定义变量
    • 自定义变量
    • 特殊变量
      • $n
      • $#
      • \$*、\$@
      • $?
  • 运算符
  • 条件判断
  • 流程控制(▲)
    • if判断
    • case语句
    • for循环
    • while循环
  • read读取控制台输入

Shell概述

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强

在这里插入图片描述

Linux提供的Shell解析器

[guozihan@hadoop100 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

bash和sh的关系

-rwxr-xr-x. 1 root root 964536 11月 25 2021 bash
lrwxrwxrwx. 1 root root 10 8月 25 20:20 bashbug -> bashbug-64
-rwxr-xr-x. 1 root root 6964 11月 25 2021 bashbug-64
lrwxrwxrwx. 1 root root 4 8月 25 20:20 sh -> bash

Centos默认的解析器是bash

[guozihan@hadoop100 bin]$ echo $SHELL
/bin/bash

Shell脚本入门

脚本格式

脚本以==#!/bin/bash== 开头(指定解析器)

第一个脚本

需求:创建一个 Shell 脚本,输出 helloworld

  • 实例实操

    首先我们先创建文件夹program,然后在文件夹里创建sh文件,vim编辑

    [guozihan@hadoop100 桌面]$ mkdir program

    [guozihan@hadoop100 桌面]$ cd program/

    [guozihan@hadoop100 program]$ touch helloword.sh

    [guozihan@hadoop100 program]$ vim helloword.sh

    #!/bin/bash
    echo "helloworld"
    

脚本常用的执行方式

  • 采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限

    sh+脚本的相对路径

    [guozihan@hadoop100 program]$ sh ./helloworld.sh
    helloworld

    sh+脚本的绝对路径

    [guozihan@hadoop100 program]$ sh /home/guozihan/桌面/program/helloworld.sh
    helloworld

    bash+脚本的相对路径

    [guozihan@hadoop100 program]$ bash ./helloworld.sh
    helloworld

    bash+脚本的相对路径

    [guozihan@hadoop100 program]$ bash /home/guozihan/桌面/program/helloworld.sh
    helloworld

  • 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x

    ①首先要赋予 helloworld.sh 脚本的+x 权限

    [guozihan@hadoop100 program]$ chmod +x helloworld.sh

    ②执行脚本

    [guozihan@hadoop100 program]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100 program]$ /home/guozihan/桌面/program/helloworld.sh
    helloworld

注意:第一种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行 权限。第二种执行方法,本质是脚本需要自己

执行,所以需要执行权限。

  • 在脚本的路径前加上“.”或者 source

    ①现有文件test.sh,内容如下

    #!/bin/bash

    A=5

    echo $A

    ②分别使用 sh,bash,./ 和 . 的方式来执行,结果如下

    [guozihan@hadoop100 program]$ bash test.sh
    5

    [guozihan@hadoop100 program]$ sh test.sh
    5

    [guozihan@hadoop100 program]$ chmod +x test.sh

    [guozihan@hadoop100 program]$ ./test.sh
    5

    [guozihan@hadoop100 program]$ . test.sh
    5

原因:

前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中

第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前 shell 里执行,而无需打开子 shell!这也是为什么我们每次要修改完/etc/profile 文件以后,需要 source 一下的原因。

开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的当前变量,父 shell 是不可见

变量

系统预定义变量

  • 常用系统变量

    $HOME、$PWD、$SHELL、$USER 等

  • 案例实操

    查看系统变量的值

    [guozihan@hadoop100 ~]$ echo $HOME
    /home/guozihan

    显示当前 Shell 中所有变量:set

    [guozihan@hadoop100 ~]$ set

自定义变量

  • 基本语法

    (1)定义变量:变量名=变量值,注意,=号前后不能有空格

    (2)撤销变量:unset 变量名

    (3)声明静态变量:readonly 变量,注意:不能 unset

  • 变量定义规则

    (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

    (2)等号两侧不能有空格

    (3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

    (4)变量的值如果有空格,需要使用双引号或单引号括起来

  • 案例实操

    定义变量 A

    [guozihan@hadoop100 ~]$ A=5

    [guozihan@hadoop100 ~]$ echo $A
    5

    给变量 A 重新赋值

    [guozihan@hadoop100 ~]$ A=8

    [guozihan@hadoop100 ~]$ echo $A
    8

    撤销变量 A

    [guozihan@hadoop100 ~]$ unset A

    [guozihan@hadoop100 ~]$ echo $A

    声明静态的变量 B=2,不能 unset

    [guozihan@hadoop100 ~]$ readonly B=2

    [guozihan@hadoop100 ~]$ echo $B
    2

    [guozihan@hadoop100 ~]$ B=9
    -bash: B: 只读变量

    在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

    [guozihan@hadoop100 ~]$ C=1+2

    [guozihan@hadoop100 ~]$ echo $C
    1+2

    变量的值如果有空格,需要使用双引号或单引号括起来

    [guozihan@hadoop100 ~]$ D=I love sunchen
    bash: love: 未找到命令…

    [guozihan@hadoop100 ~]$ D=“I love sunchen”

    [guozihan@hadoop100 ~]$ echo $D
    I love sunchen

    可把变量提升为全局环境变量,可供其他 Shell 程序使用

    export 变量

    在 helloworld.sh 文件中增加 echo $B

    #!/bin/bash 
    
    echo "helloworld" 
    echo $B
    

    [guozihan@hadoop100 program]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100 program]$ export B

    [guozihan@hadoop100 program]$ ./helloworld.sh
    helloworld
    2

特殊变量

$n

  • 基本语法

    $n 功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})

  • 案例实操

    [guozihan@hadoop100 program]$ touch parameter.sh

    [guozihan@hadoop100 program]$ vim parameter.sh

    #!/bin/bash
    echo '=$n='
    echo $0
    echo $1
    echo $
    

    [guozihan@hadoop100 program]$ chmod 777 parameter.sh

    [guozihan@hadoop100 program]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz

$#

  • 基本语法

    $# 功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性

  • 实例实操

    [guozihan@hadoop100 program]$ vim parameter.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $
    

    [guozihan@hadoop100 program]$ chmod 777 parameter.sh

    [guozihan@hadoop100 program]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz
    =$n=
    2

$*、$@

  • 基本语法

    $* 功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

    $@ 功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

  • 案例实操

    [guozihan@hadoop100 program]$ vim parameter.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $#
    echo '==========$*=========='
    echo $*
    echo '==========$@=========='
    echo $@
    

    [guozihan@hadoop100 program]$ ./parameter.sh a b c d e f g
    =$n=
    ./parameter.sh
    a
    b
    =$n=
    7
    =$n=
    a b c d e f g
    =$n=
    a b c d e f g

$?

  • 基本语法

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

  • 案例实操

    判断 helloworld.sh 脚本是否正确执行

    [guozihan@hadoop100 program]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100 program]$ echo $?
    0

运算符

  • 基本语法

    “$((运算式))” 或 “$[运算式]”

  • 案例实操

    计算(2+3)* 4 的值

    [guozihan@hadoop100 program]$ S=$[(2+3)*4]

    [guozihan@hadoop100 program]$ echo $S
    20

条件判断

  • 基本语法

    (1)test condition

    (2)[ condition ](注意 condition 前后要有空格

    注意:条件非空即为 true,[ guozihan ]返回 true,[ ] 返回 false

  • 常用判断条件

    • 两个整数之间比较

      -eq 等于(equal)

      -ne 不等于(not equal)

      -lt 小于(less than)

      -le 小于等于(less equal)

      -gt 大于(greater than)

      -ge 大于等于(greater equal)

      注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。

    • 按照文件权限进行判断

      -r 有读的权限(read)

      -w 有写的权限(write)

      -x 有执行的权限(execute)

    • 按照文件类型进行判断

      -e 文件存在(existence)

      -f 文件存在并且是一个常规的文件(file)

      -d 文件存在并且是一个目录(directory)

  • 案例实操

    23 是否大于等于 22

    [guozihan@hadoop100 program]$ [ 23 -ge 22 ]

    [guozihan@hadoop100 program]$ echo $?
    0

    helloworld.sh 是否具有写权限

    [guozihan@hadoop100 program]$ [ -w helloworld.sh ]

    [guozihan@hadoop100 program]$ echo $?

    0

    /home/atguigu/cls.txt 目录中的文件是否存在

    [guozihan@hadoop100 program]$ [ -e /home/guozihan/cls.txt ]

    [guozihan@hadoop100 program]$ echo $?
    1

    多条件判断&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令

    [guozihan@hadoop100 program]$ [ guozihan ] && echo OK || echo notOK
    OK

    [guozihan@hadoop100 program]$ [ ] && echo OK || echo notOK
    notOK

流程控制(▲)

if判断

  • 基本语法

    • 单分支

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

      或者

      if [ 条件判断式 ]
      then
      程序
      fi
      
    • 多分支

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

    注意事项:

    ①[ 条件判断式 ],中括号和条件判断式之间必须有空格

    ②if 后要有空格

  • 案例实操

    输入一个数字,如果是 1,则输出 banzhang zhen shuai,如果是 2,则输出 cls zhen mei, 如果是其它,什么也不输出。

    [guozihan@hadoop100 program]$ touch if.sh
    [guozihan@hadoop100 program]$ vim if.sh
    
    #!/bin/bash
    if [ $1 -eq 1 ]
    then
    echo "banzhang zhen shuai"
    elif [ $1 -eq 2 ]
    then
    echo "cls zhen mei"
    fi
    
    [guozihan@hadoop100 program]$ chmod 777 if.sh
    [guozihan@hadoop100 program]$ ./if.sh 1
    banzhang zhen shuai
    [guozihan@hadoop100 program]$ ./if.sh 2
    cls zhen mei
    

case语句

  • 基本语法

    case $变量名 in

    “值 1”)

    ​ 如果变量的值等于值 1,则执行程序 1

    ;;

    “值 2”)

    ​ 如果变量的值等于值 2,则执行程序 2

    ;;

    ​ …省略其他分支…

    *)

    ​ 如果变量的值都不是以上的值,则执行此程序

    ;;

    esac

    注意事项:

    (1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

    (2)双分号“;;”表示命令序列结束,相当于 java 中的 break。

    (3)最后的“*)”表示默认模式,相当于 java

  • 案例实操

    输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其它,输出 renyao。

    [guozihan@hadoop100 program]$ touch case.sh
    [guozihan@hadoop100 program]$ vim case.sh
    
    #!/bin/bash
    case $1 in
    "1")
    echo "banzhang"
    ;;
    "2")
    echo "cls"
    ;;
    *)
    echo "renyao"
    ;;
    esac
    
    [guozihan@hadoop100 program]$ chmod 777 case.sh 
    [guozihan@hadoop100 program]$ ./case.sh 
    renyao
    [guozihan@hadoop100 program]$ ./case.sh 1
    banzhang
    
    

for循环

  • 基本语法1

    for (( 初始值;循环控制条件;变量变化 ))
    do
    	程序
    done
    
  • 案例实操1

    从 1 加到 100

    [guozihan@hadoop100 program]$ touch for1.sh
    [guozihan@hadoop100 program]$ vim for1.sh 
    
    #!/bin/bash
    sum=0
    for((i=0;i<=100;i++))
    do
    sum=$[$sum+$i]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 for1.sh 
    [guozihan@hadoop100 program]$ ./for1.sh 
    5050
    
  • 基本语法2

    for 变量 in123do
    程序
    done
    
  • 案例实操2

    打印所有输入参数

    [guozihan@hadoop100 program]$ touch for2.sh
    [guozihan@hadoop100 program]$ vim for2.sh 
    
    #!/bin/bash
    #打印数字
    for i in cls mly wls
    do
    echo "ban zhang love $i"
    done
    
    [guozihan@hadoop100 program]$ chmod 777 for2.sh 
    [guozihan@hadoop100 program]$ ./for2.sh 
    ban zhang love cls
    ban zhang love mly
    ban zhang love wls
    
  • $*和$@的区别

    $*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n 的形式输出所有参数。

    当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输 出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数

while循环

  • 基本语法

    while [ 条件判断式 ]
    do
    程序
    done
    
  • 案例实操

    从 1 加到 100

    [guozihan@hadoop100 program]$ touch while.sh
    [guozihan@hadoop100 program]$ vim while.sh 
    
    #!/bin/bash
    sum=0
    i=1
    while [ $i -le 100 ]
    do
    sum=$[$sum+$i]
    i=$[$i+1]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 while.sh 
    [guozihan@hadoop100 program]$ ./while.sh 
    5050
    

read读取控制台输入

  • 基本语法

    read (选项) (参数)

    ①选项:

    -p:指定读取值时的提示符;

    -t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待

    ②参数

    变量:指定读取值的变量名

  • 案例实操

    提示 7 秒内,读取控制台输入的名称

    [guozihan@hadoop100 program]$ touch read.sh
    [guozihan@hadoop100 program]$ vim read.sh 
    
    #!/bin/bash
    read -t 7 -p "Enter your name in 7 seconds :" NN
    echo $NN
    
    [guozihan@hadoop100 program]$ chmod 777 read.sh 
    [guozihan@hadoop100 program]$ ./read.sh 
    Enter your name in 7 senconds:guozihan
    guozihan
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何判断一个java对象还活着

引用计数算法 引用计数器的算法是这样的&#xff1a;在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 缺点&#x…

el-select范围选择框

1、html <el-select v-model"searchForm.hour" :class"searchForm.hour?.length>1?edit-tag-hour:keep-tag-hour" filterable multiple clearable :multiple-limit"2" remove-tag"removeChange" change"hourChange"…

Vscode画流程图

1.下载插件 Draw.id Integration 2.桌面新建文件&#xff0c;后缀名改为XXX.drawio 在vscode打开此文件 &#xff0c;就可以进行绘制流程图啦

音频基本知识

声音传播方式: 1)声音的传播需要介质,在真空中不能传播; 2)声波属于纵波,即如下图传播方向与振动方向一致; 声音速度: 1)常温常压下,一般空气速度为340m/s; 2)温度越高,声速越大; 3)液体、固体的传播速度比空气快; 人耳可接收到的频域范围: 1)通常范围…

Spring boot中调用C/C++(dll)

添加JNA依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version> </dependency>准备C代码/C代码 如下是C代码&#xff0c;文件名&#xff1a;xizi.c #include <std…

Python实战之数据表提取和下载自动化

在网络爬虫领域&#xff0c;动态渲染类型页面的数据提取和下载自动化是一个常见的挑战。本文将介绍如何利用Pyppeteer库完成这一任务&#xff0c;帮助您轻松地提取动态渲染页面中的数据表并实现下载自动化。 一、环境准备 首先&#xff0c;确保您已经安装了Python环境。接下来…

阔别线下三年的BIRTV影视盛会:有哪些变革式创新应用?

2023年8月26日&#xff0c;以“融合创新 面向未来”为主题的第三十届北京国际广播电影电视展览会&#xff08;BIRTV 2023&#xff09;收官。这是一场阔别线下三年的行业顶尖盛会&#xff0c;展馆处处人潮涌动。 接下来盘点一下&#xff0c;本次BIRTV的一些特色应用&#xff1a…

《vue3实战》通过indexOf方法实现电影评价系统的模糊查询功能

目录 前言 一、indexOf是什么&#xff1f;indexOf有什么作用&#xff1f; 含义&#xff1a; 作用&#xff1a; 二、功能实现 这段是查询过程中过滤筛选功能的代码部分: 分析&#xff1a; 这段是查询用户和性别功能的代码部分&#xff1a; 分析&#xff1a; 三、最终效…

Python-pyqt不同窗口数据传输【使用静态函数】

文章目录 前言程序1&#xff1a;caogao1.py输入数据界面程序2&#xff1a;caogao2.py接收数据界面 程序3 &#xff1a;将输入数据界面和接收数据界面组合成一个总界面讲解 总结 前言 在编写pyqt 页面时有时候需要不同页面进行数据传输。本文讲解静态函数方法。直接看示例。 程…

pandas数据分析之数据绘图

一图胜千言&#xff0c;将信息可视化&#xff08;绘图&#xff09;是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外&#xff0c;还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文…

Python爬虫(十六)_JSON模块与JsonPath

数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;它是的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景&#xff0c;比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不相…

完善区域企业监测预警机制,助推区域产业可持续发展

“五度易链”产业大数据解决方案由产业经济、智慧招商、企业服务、数据服务四大应用解决方案组成&#xff0c;囊括了产业经济监测、产业诊断分析、企业监测预警、企业综合评估、大数据精准招商、招商智能管理、企业管理、企业培育、企业市场服务、企业金融服务、产业数据开放服…

【C++进阶(三)】STL大法--vector迭代器失效深浅拷贝问题剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; vector-下 1. 前言2. 什么是迭代器失效?3. 迭代…

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…

前端基础---HTML笔记汇总一

HTML定义 HTML超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f; 链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 标签分类 单标签:只有开始标签&#xff0c;没有结束标签(<br>换行 <hr>水平线 <img> 图像标…

Facebook message tag 使用攻略

Messenger 讯息传不出去&#xff1f;无法发送FB 讯息给非好友&#xff1f; 2020年3月&#xff0c;Facebook 为了防止用户被过多的推广或垃圾讯息困扰而更新使用条款&#xff0c;现在商家要用FB传讯息给所有人&#xff08;包括非好友&#xff09;&#xff0c;应该使用 Facebook …

C语言每日一练------Day(5)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;错误的集合 密码检查 &#x1f493;博主csdn个人主页&#xff1a;小小u…

HTTP:http上传文件的原理及java处理方法的介绍

为了说明原理&#xff0c;以下提供一个可以上传多个文件的例子&#xff0c;html页面代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>http upload file</title> </head> <body>…

字节一面:你能讲一下跨域吗

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;我们日常开发中与后端联调时一定会遇到跨域的问题&#xff0c;只有处理好了跨域才能够与后端交互完成需求&#xff0c;所以深入学习跨域…

SpringMVC-学习笔记

文章目录 1.概述1.1 SpringMVC快速入门 2. 请求2.1 加载控制2.2 请求的映射路径2.3 get和post请求发送2.4 五种请求参数种类2.5 传递JSON数据2.6 日期类型参数传递 3.响应3.1 响应格式 4.REST风格4.1 介绍4.2 RESTful快速入门4.3 简化操作 1.概述 SpringMVC是一个基于Java的Web…