文章目录

  • 概述
    • Shell解析器
      • Linux提供的Shell解析器
      • bash和sh的关系
      • CentOS默认的解析器是bash
    • Shell脚本入门
      • 脚本格式
      • 第一个Shell脚本:helloworld
      • 第二个Shell脚本:多命令处理
    • Shell中的变量
      • 系统变量
      • 自定义变量
      • 特殊变量:$n
      • 特殊变量:$#
      • 特殊变量:\$*、\$@
      • 特殊变量:$?
    • 运算符
    • 条件判断
      • 基本语法
      • 案例实操
    • 流程控制
      • if判断
      • case语句
      • for循环
      • while循环
    • read读取控制台输入

概述

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

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

Shell解析器

Linux提供的Shell解析器

[root@CentOS001 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

bash和sh的关系

[root@CentOS001 bin]# ll |grep bash
-rwxr-xr-x. 1 root root  906568 3月  23 2017 bash
lrwxrwxrwx. 1 root root       4 3月  23 2020 sh -> bash
[root@CentOS001 bin]#

CentOS默认的解析器是bash

[root@CentOS001 bin]# echo $SHELL
/bin/bash
[root@CentOS001 bin]#

Shell脚本入门

脚本格式

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

第一个Shell脚本:helloworld

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

(2)案例实操:

[root@CentOS001 shell2020]# touch helloworld.sh[root@CentOS001 shell2020]# vim helloworld.sh

在helloworld.sh中输入如下内容

#!/bin/bashecho "hello the world"

(3)脚本的常用执行方式

第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

​ sh+脚本的相对路径

[root@CentOS001 shell2020]# sh helloworld.sh hello the world

​ sh+脚本的绝对路径

[root@CentOS001 shell2020]# sh /home/datas/shell2020/helloworld.sh hello the world

​ bash+脚本的相对路径

[root@CentOS001 shell2020]# bash helloworld.sh hello the world

​ bash+脚本的绝对路径

[root@CentOS001 shell2020]# bash /home/datas/shell2020/helloworld.sh hello the world

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

(a)首先要赋予helloworld.sh 脚本的+x权限

[root@CentOS001 shell2020]# chmod 777 helloworld.sh

(b)执行脚本

相对路径

[root@CentOS001 shell2020]# ./helloworld.sh hello the world

绝对路径

[root@CentOS001 shell2020]# /home/datas/shell2020/helloworld.sh hello the world

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

第二个Shell脚本:多命令处理

(1)需求:

在/home/shell2020/目录下创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”。

(2)案例实操:

[root@CentOS001 shell2020]# touch batch.sh[root@CentOS001 shell2020]# vi batch.sh

在batch.sh中输入如下内容

#!/bin/bash cd /home/shell2020touch cls.txtecho "I love cls" >>cls.txt

Shell中的变量

系统变量

  • 常用系统变量

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

  • 案例实操

(1)查看系统变量的值

[root@CentOS001 shell2020]# echo $HOME
/root
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $PWD
/shell2020
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $USER
root
[root@CentOS001 shell2020]#

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

[root@CentOS001 shell2020]# set
B=700
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(2)-release'

自定义变量

  • 基本语法

    • 定义变量:变量=值
    • 撤销变量:unset 变量
    • 声明静态变量:readonly变量,注意:不能unset
  • 变量定义规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
    • 等号两侧不能有空格
    • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
    • 变量的值如果有空格,需要使用双引号或单引号括起来
  • 案例实操

​ (1)定义变量A

[root@CentOS001 shell2020]# A=40
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $A
40
[root@CentOS001 shell2020]#

​ (2)给变量A重新赋值

[root@CentOS001 shell2020]# A=900
[root@CentOS001 shell2020]# echo $A
900
[root@CentOS001 shell2020]#

​ (3)撤销变量A

[root@CentOS001 shell2020]# unset A
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $A[root@CentOS001 shell2020]#

​ (4)声明静态的变量B=2,不能unset

[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# readonly C=444
[root@CentOS001 shell2020]# echo $C
444
[root@CentOS001 shell2020]# C=5555
-bash: C: readonly variable
[root@CentOS001 shell2020]# unset C
-bash: unset: C: cannot unset: readonly variable
[root@CentOS001 shell2020]#

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

[root@CentOS001 shell2020]# W=1+2
[root@CentOS001 shell2020]# echo $W
1+2
[root@CentOS001 shell2020]#

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

[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# A=I LOVE YOU
-bash: LOVE: command not found
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# A="I LOVE YOU"
[root@CentOS001 shell2020]# echo $A
I LOVE YOU
[root@CentOS001 shell2020]#

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

export 变量名

[root@CentOS001 shell2020]# vim helloworld.sh

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

#!/bin/bashecho "helloworld"echo $B
[root@CentOS001 shell2020]# ./helloworld.sh Helloworld

发现并没有打印输出变量B的值。

[root@CentOS001 shell2020]# export B[root@CentOS001 shell2020]# ./helloworld.sh helloworld2

特殊变量:$n

  • 基本语法

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

  • 案例实操

(1)输出该脚本文件名称、输入参数1和输入参数2 的值

[root@CentOS001 data]# touch parameter.sh [root@CentOS001 data]# vim parameter.sh
\#!/bin/bash
echo "$0  $1  $2"
[root@CentOS001 data]# chmod 777 parameter.sh[root@CentOS001 data]# ./parameter.sh cls  xz./parameter.sh  cls  xz

特殊变量:$#

  • 基本语法

    ​ $# (功能描述:获取所有输入参数个数,常用于循环)。

  • 案例实操

(1)获取输入参数的个数

[root@CentOS001 data]# vim parameter.sh
#!/bin/bashecho "$0  $1  $2"echo $#
[root@CentOS001 data]#chmod 777 parameter.sh[root@CentOS001 data]# ./parameter.sh cls  xzparameter.sh cls xz 2

特殊变量:$*、$@

  • 基本语法

    • $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
    • $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
  • 案例实操

(1)打印输入的所有参数

[root@CentOS001 data]# vim parameter.sh
#!/bin/bashecho "$0  $1  $2"echo $#echo $*echo $@
[root@CentOS001 data]# bash parameter.sh 1 2 3parameter.sh  1  231 2 31 2 3

特殊变量:$?

  • 基本语法

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

  • 案例实操

​ (1)判断helloworld.sh脚本是否正确执行

[root@CentOS001 data]# ./helloworld.sh hello world[root@CentOS001 data]# echo $?0

运算符

  • 基本语法

    • “$((运算式))”或“$[运算式]”
    • expr + , - , *, /, % 加,减,乘,除,取余
    • 注意:expr运算符间要有空格
  • 案例实操:

(1)计算3+2的值

[root@CentOS001 data]# expr 2 + 35

(2)计算3-2的值

[root@CentOS001 data]# expr 3 - 2 1

(3)计算(2+3)X4的值

  • expr一步完成计算
[root@CentOS001 data]# expr `expr `2 + 3` \* 420
  • 采用$[运算式]方式
[root@CentOS001 data]# S=$[(2+3)*4][root@CentOS001 data]# echo $S

条件判断

基本语法

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

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

  • 常用判断条件

    • (1)两个整数之间比较

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

案例实操

​ (1)23是否大于等于22

[root@CentOS001 data]# [ 23 -ge 22 ]
[root@CentOS001 data]# echo $?
0
[root@CentOS001 data]#

​ (2)helloworld.sh是否具有写权限

[root@CentOS001 data]# [ -w helloworld.sh ][root@CentOS001 data]# echo $?0

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

[root@CentOS001 data]# [ -e /home/atguigu/cls.txt ][root@CentOS001 data]# echo $?1

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

[root@CentOS001 data]# [ condition ] && echo OK || echo notokOK[root@CentOS001 data]# [ condition ] && [ ] || echo notoknotok

流程控制

if判断

  • 基本语法
if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi

​ 注意事项:

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

(2)if后要有空格

  • 案例实操

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

[root@CentOS001 data]# touch if.sh[root@CentOS001 data]# vim if.sh
#!/bin/bashif [ $1 -eq "1" ]thenecho "banzhang zhen shuai"elif [ $1 -eq "2" ]thenecho "cls zhen mei"fi
[root@CentOS001 data]# chmod 777 if.sh [root@CentOS001 data]# ./if.sh 1banzhang zhen shuai

case语句

  • 基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac

注意事项:

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

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

  3. 最后的“*)”表示默认模式,相当于java中的default。

  • 案例实操

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

[root@CentOS001 data]# touch case.sh[root@CentOS001 data]# vim case.sh
!/bin/bashcase $1 in"1")echo "banzhang";;"2")echo "cls";;*)echo "renyao";;esac
[root@CentOS001 data]# chmod 777 case.sh[root@CentOS001 data]# ./case.sh 11

for循环

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

(1)从1加到100

[root@CentOS001 data]# touch for1.sh[root@CentOS001 data]# vim for1.sh
#!/bin/bashs=0for((i=0;i<=100;i++))dos=$[$s+$i]doneecho $s
[root@CentOS001 data]# chmod 777 for1.sh [root@CentOS001 data]# ./for1.sh “5050”
  • 基本语法2
for 变量 in 值1 值2 值3… do 程序 done
  • 案例实操

​ (1)打印所有输入参数

[root@CentOS001 data]# touch for2.sh[root@CentOS001 data]# vim for2.sh
#!/bin/bash\#打印数字for i in $*doecho "ban zhang love $i "done
[root@CentOS001 data]# chmod 777 for2.sh [root@CentOS001 data]# bash for2.sh cls xz bdban zhang love clsban zhang love xzban zhang love bd
  • 比较$*和$@区别

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

      [root@CentOS001 data]# touch for.sh[root@CentOS001 data]# vim for.sh
      
       #!/bin/bash for i in $*do   echo "ban zhang love $i "done for j in $@do        echo "ban zhang love $j"done
      
      [root@CentOS001 data]# bash for.sh cls xz bdban zhang love cls
      ban zhang love xz
      ban zhang love bd
      ban zhang love cls
      ban zhang love xz
      ban zhang love bd
      
    • 当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。

      [root@CentOS001 data]# vim for.sh
      
      #!/bin/bash for i in "$*"
      #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo "ban zhang love $i"done  for j in "$@"
      #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo "ban zhang love $j"
      done
      
      [root@CentOS001 data]# chmod 777 for.sh
      [root@CentOS001 data]# bash for.sh cls xz bd
      ban zhang love cls xz bd
      ban zhang love cls
      ban zhang love xz
      ban zhang love bd
      

while循环

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

​ (1)从1加到100

[root@CentOS001 data]# touch while.sh

[root@CentOS001 data]# vim while.sh

#!/bin/bashs=0
i=1
while [ $i -le 100 ]
dos=$[$s+$i]i=$[$i+1]
done
echo $s
[root@CentOS001 data]# chmod 777 while.sh
[root@CentOS001 data]# ./while.sh 5050

read读取控制台输入

  • 基本语法

    read(选项)(参数)

选项:

- -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒)。

    • 参数
  • 变量:指定读取值的变量名

  • 案例实操

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

    [root@CentOS001 data]# touch read.sh
    [root@CentOS001 data]# vim read.sh
    
    #!/bin/bashread -t 7 -p "Enter your name in 7 seconds " NAME
    echo $NAME
    
    [root@CentOS001 data]# ./read.sh
    Enter your name in 7 seconds xiaoze
    xiaoze
    

Shell常用内容汇总相关推荐

  1. linux常用的命令shell,Linux操作系统Shell和常用命令汇总

    简述 本文主要介绍Shell和Linux常用命令. Shell Shell 是一个用 C 语言编写的应用程序,提供了用户访问Linux操作系统内核服务的界面,它可以用来启动.挂起.停止.编写程序.Sh ...

  2. 史上最全的Linux常用命令汇总①收藏这一篇就够了!(超全,超详细)

    史上最全的Linux常用命令汇总①(超全面!超详细!)收藏这一篇就够了! Linux命令基础 Shell Linux命令分类 Linux命令行的格式 编辑Linux命令行的辅助操作 获取命令帮助的方法 ...

  3. shell 字符串处理汇总(查找,替换等等)

    http://blog.chinaunix.net/uid-20771623-id-3841521.html shell 字符串处理汇总(查找,替换等等) 字符串: 简称"串".有 ...

  4. Linux下Shell常用命令与工具

    文章目录 Shell常用命令与工具 1.ls 2.echo 3.printf 4.cat 5.tac 6 .rev 7.wc 8.cp 9.mkdir 10.mv 11.rename 12.dirna ...

  5. shell常用的基础命令

    shell常用的基础命令 1 diff命令 2 patch命令 3 cut命令 4 sort命令 5 uniq 命令 6 tr命令 7 &&和 || 8 test命令 8.1 test ...

  6. Linux Shell常用技巧(三) sed

    Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区 ...

  7. PHP常用正则表达式汇总 [复制链接]

    PHP常用正则表达式汇总 [复制链接] 上一主题下一主题   离线我是小猪头 法师 发帖 539 加关注 发消息 只看楼主 倒序阅读 使用道具楼主  发表于: 2011-06-22 更多 - 本帖被 ...

  8. python命令大全下载-Python pip 常用命令汇总

    使用了这么就pip命令,但是一直是简单使用,很多命令都是用了查,查了用,今天把常用的命令汇总一下,方便使用. 命令: pip 由上图可以看到 pip 支持一下命令 Commands: install ...

  9. python常用命令大全-Python pip 常用命令汇总

    使用了这么就pip命令,但是一直是简单使用,很多命令都是用了查,查了用,今天把常用的命令汇总一下,方便使用. 命令: pip 由上图可以看到 pip 支持一下命令 Commands: install ...

最新文章

  1. vector容器中erase(删除)的使用
  2. 1016. Phone Bills (25)
  3. HOWTO:如何修改InstallShield的运行环境
  4. leetcode算法题--字符串的排列
  5. Python代码块批量添加Tab缩进
  6. mysql MHA高可用架构安装
  7. html页面选择指定条件在下方显示,如何从符合特定条件的HTML中找到CSS选择器?...
  8. 如何申请outlook.com的邮箱
  9. getdatatable mysql_C# 自定义MySqlHelp类,包含了获取DataTable的方法,但是调用时总是提示“类型初始值设定项引发异常”...
  10. [LUOGU] P1111 修复公路
  11. 代替Reflection(反射)的一些方法(转)
  12. (转)惊鸿一瞥:人工智能,改变研究方式的力量
  13. 计算机单片机考试作弊检讨书,考试作弊检讨书(精选5篇)
  14. SQL练习题共50道附答案(MySQL
  15. JavaScript开发——文件夹的上传和下载
  16. 【2022修复版】社群扫码进群活码引流完整运营源码/带视频搭建教程
  17. Kotlin/DSL(Anko),原汁原味Kotlin开发Android---Activity Fragment与AnkoUI分离,强大的复用,更加便捷的开发
  18. python: 贝叶斯实现实例
  19. java ip加入黑名单_关于黑名单IP的设置
  20. 为什么一定要调用fclose函数

热门文章

  1. Cargo 教程介绍
  2. 单片机原理,单片机能做什么?
  3. 【项目展示】一个有点难度的猜数字小游戏(Java编写)
  4. k8S中的MySQL如何扩容_Kubernetes的etcd多节点扩容实战技巧
  5. PTA基础编程题目集-6-9 统计个位数字
  6. Codeforce DIV2 614 SZU的cf集训round1 C ~ D
  7. UVA11384 Help is needed for Dexter (规律、思维)
  8. 简单理解重量级锁、轻量级锁、偏向锁
  9. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)
  10. php排序最新,PHP排序的几种方法,值得来看!