一、简析shell

shell是一个命令行解释器,接收应用程序、用户命令,调用操作系统内核。

1、Linux提供的shell解释器:

输入    cat /etc/shells 

/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

2、bash和sh的关系

sh是bash的软连接,bash和sh是同一个解释器

3、centos默认的解析器是bash

二、shell脚本

1、脚本格式

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

2、创建第一个shell脚本

#创建文件夹存放shell练习的脚本
[root@hadoop100 ~] mkdir ./data
#在data文件夹中创建HelloWorld脚本
[root@hadoop100 ~] cd data/
[root@hadoop100 data] touch helloworld.sh
[root@hadoop100 data] vim helloworld.sh 
        #!/bin/bash

        echo "helloworld!!!"
#执行脚本的方式1
[root@hadoop100 data] bash helloworld.sh 
helloworld!!!
#执行脚本的方式2
[root@hadoop100 data] sh helloworld.sh 
helloworld!!!
#执行脚本的方式3
[root@hadoop100 data] ll
总用量 4
-rw-r--r--. 1 root root 35 2月  19 17:49 helloworld.sh
#将文件更改为可执行的文件
[root@hadoop100 data] chmod 744 helloworld.sh 
[root@hadoop100 data] ll
总用量 4
-rwxr--r--. 1 root root 35 2月  19 17:49 helloworld.sh
[root@hadoop100 data] ./helloworld.sh 
helloworld!!!

三、变量

1、常用的系统

变量

$HOME   根目录
$PATH	环境变量
$PWD	路径
$SHELL  shell解释器
$USER	登录的用户
set    显示全部的变量
2、自定义变量

2.1、基本语法

变量=值(中间不能有空格)

撤销变量: unset 变量名

静态变量: readonly 变量(不能用unset)

2.2、变量名命名规则

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

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

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

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

2.3、实验

#定义变量A $A相当于是取地址符号
[root@hadoop100 data] A=9
[root@hadoop100 data] echo $A
9
#撤销变量
[root@hadoop100 data] unset A
[root@hadoop100 data] echo $A
#变量默认的类型是字符串类型,不能进行数值运算
[root@hadoop100 data] A=1+2
[root@hadoop100 data] echo $A
1+2
#如果变量有空格,用双引号或单引号包裹
[root@hadoop100 data] D="hei boy"
[root@hadoop100 data] echo $D
hei boy
#export提升变量为全局变量
[root@hadoop100 data] vim helloworld.sh 
[root@hadoop100 data] ./helloworld.sh 
helloworld!!!
[root@hadoop100 data] export D
[root@hadoop100 data] ./helloworld.sh 
helloworld!!!
hei boy
3、特殊变量

3.1 $n

功能:n为数字,$0表示脚本名称,$1 - $9表示第1-9个参数,10以上的参数用大括号包含${10}

[root@hadoop100 data] touch parameter.sh
[root@hadoop100 data] vim parameter.sh 
#!/bin/bash
echo "$1 $2"
[root@hadoop100 data] chmod 744 parameter.sh    
[root@hadoop100 data] ./parameter.sh hei boy
hei  boy

3.2 $#

功能:获取所有输入参数个数,常用于循环

[root@hadoop100 data] vim parameter.sh 
#!/bin/bash
echo "$1 $2"
echo $#
[root@hadoop100 data] ./parameter.sh hei boy
hei  boy
2

3.3 $ $@*

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

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

注意:如果想让centos如何执行mvn命令 centos怎么执行sh文件_centos如何执行mvn命令@ 体现区别必须用双引号括起来才生效

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

3.4 $?

功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了。

[root@hadoop100 data] ./parameter.sh 1 2 3
1  2
3
1 2 3
1 2 3
[root@hadoop100 data] echo $?
0

四、运算符

基本语法

$((运算式)

$[运算式]

[root@hadoop100 data] d=$((3+2))
[root@hadoop100 data] echo $d
5
[root@hadoop100 data] c=$[3+2]
[root@hadoop100 data] echo $c
5

五、条件判断

1、基本语法

(1)test condition

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

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

2、常用得判断条件

(1)两个整数之间比较

== 字符串比较

-lt 小于(less than)

-le 小于等于(less equal)

-ge 大于等于(greater equal)

-ne 不等于(Not equal)

-eq 等于(equal)

-gt 大于(greater than)

(2)按照文件权限进行判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执行的权限(execute)

(3)按照文件类型进行判断

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

-e 文件存在(existence)

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

#判断大小的正确
[cy@hadoop100 ~]$ [ 22 -ge 12 ]
[cy@hadoop100 ~]$ echo $?
0
#查看某文件是否有写权限
[cy@hadoop100 data]$ [ -w hello.sh ]
[cy@hadoop100 data]$ echo $?
0

(4)多条件判断

&& 表示前一条命令执行成功时,才执行后一条命令;

|| 表示上一条命令执行失败后,才执行下一条命令;

六、流程控制

6.1、if判断

1、基本语法

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

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

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
1、touch if.sh
2、vim if.sh
		#!/bin/bash

        if [ $1 -eq "1" ]
        then
                echo "hei boy!!!"
        elif [ $1 -eq "2" ]
        then
                echo "hei girl!!!"
        fi
3、chmod 744 if.sh
4、./if.sh 2
6.2 case语句

1、基本语句

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

注意事项:

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

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

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

[cy@hadoop100 data]$ touch case.sh
[cy@hadoop100 data]$ chmod 744 case.sh 
[cy@hadoop100 data]$ vim case.sh 
        #!/bin/bash

        case $1 in
        "1")
                echo "hei boy!!!"
                ;;
        "2")
                echo "hei girl!!!"
                ;;
        *)
                echo "hei!!!!"
                ;;
        esac

[cy@hadoop100 data]$ ./case.sh 2
hei girl!!!
6.3 for 循环

1、基本语法

for ((初始值;循环控制条件;变量变化))
do 
	程序
done
[cy@hadoop100 data]$ touch for.sh
[cy@hadoop100 data]$ chmod 744 for.sh 
[cy@hadoop100 data]$ vim for.sh 
        #!/bin/bash

        s=0
        for ((i=0;i<=100;i++))
        do
                s=$[i+s]
        done

        echo $s

[cy@hadoop100 data]$ ./for.sh 
5050

2、基础语法2

for 变量 in 值1 值2 值3 ……
	do 
		程序
	done
[cy@hadoop100 data]$ vim for2.sh 
    #!/bin/bash

    #$*将所有的参数作为一个整体,如果要其实作为整体输出就必须要加上“$*”才能达到这个效果,
    其他的不行
    for i in $*
            do
                    echo "hei $i"
            done
    #$@ 参数不是作为一个整体是将参数分开来
    for j in $@
            do
                    echo "hei $j"
            done

    for k in "$*"
            do
                    echo "hei $k"
            done

    for m in "$@"
            do
                    echo "hei $m"
            done

[cy@hadoop100 data]$ ./for2.sh boy girl
hei boy
hei girl
hei boy
hei girl
hei boy girl
hei boy
hei girl
6.4 while循环

1、基本语法

while [ 条件判断式 ]
	do
		程序
	done
[cy@hadoop100 data]$ vim while.sh 
    #!/bin/bash


    s=0
    i=1
    while [ $i -le 100 ]
    do
            s=$[$s+$i]
            i=$[$i+1]
    done

    echo $s

[cy@hadoop100 data]$ ./while.sh 
5050