zoukankan      html  css  js  c++  java
  • 02.Shell编程

    1、Shell概述

      Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。

    2、Shell解析器

    ① Linux提供的Shell解析器

    [root@hadoop ~]# cat /etc/shells
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
    

    ② sh和bash的关系

    [root@hadoop bin]# ll | grep bash
    -rwxr-xr-x  1 root root      960472 Dec  7  2016 bash
    lrwxrwxrwx  1 root root           4 Aug 18  2017 sh -> bash
    

    ​ 可以看出sh是bash的软连接

    ③ Centos默认的解析器是bash

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

    3、Shell脚本入门

    1.脚本格式

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

    2.第一个Shell脚本:helloworld

    [root@hadoop shell]$ touch helloworld.sh
    [root@hadoop shell]$ vi helloworld.sh
    
    在helloworld.sh中输入如下内容
    #!/bin/bash
    echo "helloworld"
    

    3.脚本的常用执行方式

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

    sh+脚本的相对路径/绝对路径 或 bash+脚本的相对路径/绝对路径
    [root@hadoop shell]$ bash helloworld.sh 
    Helloworld
    [root@hadoop shell]$ sh helloworld.sh 
    Helloworld
    

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

    [root@hadoop shell]$ chmod 777 helloworld.sh
    [root@hadoop shell]$ ./helloworld.sh 
    Helloworld
    

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

    4.多命令处理

    需求:在/root目录下创建一个note.txt,在note.txt文件中增加“I love shell”。
    
    [root@hadoop shell]$ touch batch.sh
    [root@hadoop shell]$ vi batch.sh
    
    在batch.sh中输入如下内容
    #!/bin/bash
    
    cd /home/atguigu
    touch cls.txt
    echo "I love cls" >>cls.txt
    

    4、Shell中的变量

    4.1 系统变量

    常用系统变量:$HOME、$PWD、$SHELL、$USER

    查看系统变量的值:
    	[root@hadoop shell]$ echo $HOME
    
    显示当前Shell中所有变量:
    	[root@hadoop shell]$ set
    

    4.2 自定义变量

    基本语法:

    ​ ① 定义变量:变量=值

    ​ ② 撤销变量:unset 变量

    ​ ③ 声明静态变量:readonly变量,注意:不能unset

    变量定义规则:

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

    ​ ② 等号两侧不能有空格

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

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

    4.3 特殊变量

    ①$n

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

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

    ②$#

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

    [root@hadoop shell]# vim parameter.sh
    
    #!/bin/bash
    echo "$0  $1   $2"
    echo $#
    
    [root@hadoop shell]# chmod 777 parameter.sh
    
    [root@hadoop shell]# ./parameter.sh cls  xz
    parameter.sh cls xz 
    2
    
    

    $*、$@

    基本用法:
    $*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
    $@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

    [root@hadoop shell]# vim parameter.sh
    
    #!/bin/bash
    echo "$0  $1   $2"
    echo $#
    echo $*
    echo $@
    
    [root@hadoop shell]# bash parameter.sh 1 2 3
    parameter.sh  1   2
    3
    1 2 3
    1 2 3
    
    

    ④$?

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

    [root@hadoop shell]# ./helloworld.sh 
    hello world
    [root@hadoop shell]# echo $?
    0
    
    

    5、运算符

    基本语法:
    1、“$((运算式))”或“$[运算式]”
    2、expr + , - , *, /, % 加,减,乘,除,取余
    注意:expr运算符间要有空格

    (1)计算3+2的值
    [root@hadoop shell]# expr 2 + 3
    5
    (2)计算3-2的值
    [root@hadoop shell]# expr 3 - 2 
    1
    (3)计算(2+3)X4的值
    	(a)expr一步完成计算
    	[root@hadoop shell]# expr `expr 2 + 3` * 4
    	20
    	(b)采用$[运算式]方式
    	[root@hadoop shell]# S=$[(2+3)*4]
    	[root@hadoop shell]# echo $S
    
    

    6、条件判断

    基本语法:[ condition ](注意condition前后要有空格),注意:条件非空即为true,[] 返回false。

    常用判断条件:

    ​ ① 两个整数之间比较

    ​ = 字符串比较

    ​ -lt 小于(less than) -le 小于等于(less equal)

    ​ -eq 等于(equal) -gt 大于(greater than)

    ​ -ge 大于等于(greater equal) -ne 不等于(Not equal)

    ​ ② 按照文件权限进行判断

    ​ -r 有读的权限(read) -w 有写的权限(write)

    ​ -x 有执行的权限(execute)

    ​ ③ 按照文件类型进行判断

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

    ​ -e 文件存在(existence) -d 文件存在并是一个目录(directory)

    (1)23是否大于等于22
    [root@hadoop shell]# [ 23 -ge 22 ]
    [root@hadoop shell]# echo $?
    0
    (2)helloworld.sh是否具有写权限
    [root@hadoop shell]# [ -w helloworld.sh ]
    [root@hadoop shell]# echo $?
    0
    (3)/home/shell/cls.txt目录中的文件是否存在
    [root@hadoop shell]# [ -e /home/shell/cls.txt ]
    [root@hadoop shell]# echo $?
    1
    
    

    7、流程控制

    7.1 if判断

    基本语法:
    1、
    if [ 条件判断式 ];then
    	程序
    fi
    2、
    if [ 条件判断式 ]
    	then
    		程序
    elif[ 条件判断式 ]
    	then
    		程序
    else
    	程序
    fi
    注意事项:
    	1.[ 条件判断式 ],中括号和条件判断式之间必须有空格
    	2.if后要有空格
    
    实操:
    ##单个if流程的使用
    if [ $1 -ge 3 ];then
            echo "hello if"
    fi
    ##if-elif-else的使用
    #!/bin/bash
    if [ $1 -ge 3 ]
    	then
    		echo "hello if"
    elif [ $1 -ge 2 ]
    	then
    		echo "hello if2"
    else
    	echo "hello if3"
    fi
    
    
    

    7.2 case语句

    基本语法:
    case $变量名 in
    "值1")
    	程序1
    ;;
    "值2")
    	程序2
    ;;
    *)
    	其他程序
    ;;
    esac
    
    注意事项:
    	1.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    	2.双分号“;;”表示命令序列结束,相当于java中的break。
    	3.最后的“*)”表示默认模式,相当于java中的default。
    实操:
    #!/bin/bash
    case $1 in
    "1")
    	echo "Hello A"
    ;;
    "2") 
    	echo "Hello B"
    ;;
    *)
    	echo "Hello C"
    ;;
    esac
    
    
    

    7.3 for循环

    基本语法1:
    for((初始值;循环控制条件;变量变化))
    	do
    		程序
    	done
    实操:
    s=0
    for((i=0;i<100;i++))
    do
    	s=$[ s+i ]
    done
    echo $s
    
    基本语法2:
    for 变量 in 值1 值2 值3...
    	do
    		程序
    done
    
    实操:
    for i in "$@"
    do
    	echo "I love this $i"
    done
    
    注:$*和$@的区别
    当不被双引号包围的时候,$*和$@参数均会以$1 $2 ... $n的的形式输出
    当被双引号包围的时候,$*参数会被当做一个整体输出
    
    
    

    7.4 whilie 循环

    基本语法:
    while [ 条件判断式 ] 
      do 
        程序
      done
    
    实操:
    #!/bin/bash
    i=5
    while [ $i -gt 1 ]
    do 
    	i=$[ i =$i-1 ]
    	echo $i
    done
    
    

    8、read读取控制台输入

  • 相关阅读:
    css中position的两种定位(absolute、relative)
    C# 如何转换生成长整型的时间
    C# 如何转换生成长整型的时间
    C# 如何转换生成长整型的时间
    easyui dialog的一个小坑
    easyui dialog的一个小坑
    ACM2027
    [VUE]关于路由哪些事儿
    hexo+github
    我们一起学React Native(一):环境配置
  • 原文地址:https://www.cnblogs.com/hucheng1997/p/11733563.html
Copyright © 2011-2022 走看看