shell学习

shell真是我见过的语法格式最奇葩的语言。。。

参考视频:https://www.bilibili.com/video/BV1hW41167NW?from=search&seid=13905275811470306066

01_shell 的概述

shell学习

 

 

 

shell是一个命令行解释器,它接受应用程序/用户命令,然后调用系统内核。(用户无法直接调用系统内核,通过操作shell从而到达操作硬件)

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

02_shell解释器

查看Linux下shell的解释器,sudo cat  /etc/shells/ 查看

shell学习

 

 

 可以看到,有 sh,bash,nologin,dash,tcsh,csh 这六种,

shell脚本的特点一般是以.sh结尾,

这六种中生活中常用的是sh和bash (sh->bash sh最终还是调用的bash)

系统的变量默认解析shell用的是bash解析

0_3 shell_hello word 案例

1.脚本格式 : 脚本以 #!/bin/bash 开头

touch  helloword.sh

vim  helloword.sh

#!/bin/bash

echo "hello word "

2.脚本的常用执行方式

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

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

Linux下单双箭头的含义

单箭头:覆盖

双箭头:追加

比如:

ls > /home/a.txt

把当前目录的文件列表写入 /home目录下的a.txt文件,如果a.txt不存在会自动创建,如果存在会清空文件内容再写入

ls >> /home/a.txt

如果a.txt不存在也会自动创建,如果存在不会清空文件内容,再文本最下方追加写入

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

(1)需求:

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

(2)案例实操:

[atguigu@hadoop101 datas]$ touch batch.sh

[atguigu@hadoop101 datas]$ vi batch.sh

 

在batch.sh中输入如下内容

#!/bin/bash

 

cd /home/atguigu

touch cls.txt

echo "I love cls" >>cls.txt

0_4 shell系统中的变量

1. 常用系统变量

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

shell学习

 

 

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

     [atguigu@hadoop101 datas]$ set 

    BASH=/bin/bash

    BASH_ALIASES=()

    BASH_ARGC=()

    BASH_ARGV=()

2.自定义变量

1.基本语法

(1)定义变量:变量=值

(2)撤销变量:unset 变量

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

2.变量定义规则

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

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

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

            比如 c=1+1

            echo c

            显示1+1

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

           例如  D=”my name is zhang xxx "

shell学习

 

 

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

author="严长生"

echo $author

echo ${author}

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

skill="Java"

echo "I am good at ${skill}Script"

如果不给 skill 变量加花括号,写成echo "I am good at $skillScript",解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

3.案例实操

       (1)定义变量A

[atguigu@hadoop101 datas]$ A=5

[atguigu@hadoop101 datas]$ echo $A

5

       (2)给变量A重新赋值

[atguigu@hadoop101 datas]$ A=8

[atguigu@hadoop101 datas]$ echo $A

8

       (3)撤销变量A

[atguigu@hadoop101 datas]$ unset A

[atguigu@hadoop101 datas]$ echo $A

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

[atguigu@hadoop101 datas]$ readonly B=2

[atguigu@hadoop101 datas]$ echo $B

2

[atguigu@hadoop101 datas]$ B=9

-bash: B: readonly variable

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

[atguigu@hadoop102 ~]$ C=1+2

[atguigu@hadoop102 ~]$ echo $C

1+2

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

[atguigu@hadoop102 ~]$ D=I love banzhang

-bash: world: command not found

[atguigu@hadoop102 ~]$ D="I love banzhang"

[atguigu@hadoop102 ~]$ echo $A

I love banzhang

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

export 变量名

[atguigu@hadoop101 datas]$ vim helloworld.sh

 

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

#!/bin/bash

 

echo "helloworld"

echo $B

 

[atguigu@hadoop101 datas]$ ./helloworld.sh

Helloworld

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

[atguigu@hadoop101 datas]$ export B

0_5 shell $n 特殊案例

1.基本语法

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

2.案例实操

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

[atguigu@hadoop101 datas]$ touch parameter.sh

[atguigu@hadoop101 datas]$ vim parameter.sh

 #!/bin/bash

echo "$0  $1   $2"

[atguigu@hadoop101 datas]$ ./parameter.sh cls  xz

./parameter.sh  cls   xz

0_6  特殊变量:$#

1.基本语法

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

2.案例实操

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

[atguigu@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

echo $#

[atguigu@hadoop101 datas]$ ./parameter.sh cls  xz

parameter.sh cls xz

2

0_7 特殊变量:$*、$@

1.基本语法

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

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

2.案例实操

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

[atguigu@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

echo $#                  获取输入参数的个数

echo $*

echo $@

 

[atguigu@hadoop101 datas]$ bash parameter.sh 1 2 3

parameter.sh  1   2

3

1 2 3

1 2 3

0_8  特殊变量:$?

1.基本语法

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

2.案例实操

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

[atguigu@hadoop101 datas]$ ./helloworld.sh

hello world

[atguigu@hadoop101 datas]$ echo $?

0

0_9 运算符      

1.基本语法

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

(2)expr  + , - , \*,  /,  %    加,减,,除,取余           注意,这里的乘号是 \*

注意:expr运算符间要有空格

2.案例实操:

(1)计算3+2的值

[atguigu@hadoop101 datas]$ expr 2 + 3       加号左右要有空格,没空格会报错

5

(2)计算3-2的值

[atguigu@hadoop101 datas]$ expr 3 - 2

1

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

(a)expr一步完成计算

[atguigu@hadoop101 datas]$ expr `expr 2 + 3` \* 4

20

(b)采用$[运算式]方式

[atguigu@hadoop101 datas]# S=$[(2+3)*4]

[atguigu@hadoop101 datas]# echo $S

0_10 条件判断

1.基本语法

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

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

2. 常用判断条件

(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)

3.案例实操

       (1)23是否大于等于22

[atguigu@hadoop101 datas]$ [ 23 -ge 22 ]          注意: -ge 前后要有空格 !!!

[atguigu@hadoop101 datas]$ echo $?

0

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

[atguigu@hadoop101 datas]$ [ -w helloworld.sh ]

[atguigu@hadoop101 datas]$ echo $?                      这条语句的意思是查看上一条命令是否正常执行

0

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

[atguigu@hadoop101 datas]$ [ -e /home/atguigu/cls.txt ]

[atguigu@hadoop101 datas]$ echo $?

1                                                                                  返回1,说明不存在

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

[atguigu@hadoop101 ~]$ [ condition ] && echo OK || echo notok

OK

[atguigu@hadoop101 datas]$ [ condition ] && [ ] || echo notok

notok

0_11  流程控制(重点)

 if 判断

1.基本语法

if[条件判断式1]
then
当条件判断式1成立时,执行程序1
elif [条件判断式2]
then
当条件判断式2成立时,执行程序2
…省略更多条件...
else
当所有条件都不成立时,最后执行此程序、
fi

       注意事项:

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

(2)if后要有空格

2.案例实操

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

[atguigu@hadoop101 datas]$ touch if.sh

[atguigu@hadoop101 datas]$ vim if.sh

 

#!/bin/bash

 

if [ $1 -eq "1" ]

then

        echo "banzhang zhen shuai"

elif [ $1 -eq "2" ]

then

        echo "cls zhen mei"

fi

 

[atguigu@hadoop101 datas]$ chmod 777 if.sh

[atguigu@hadoop101 datas]$ ./if.sh 1

banzhang zhen shuai

0_12 case 语句

1.基本语法

case $变量名 in

  "值1")

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

    ;;

  "值2")

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

    ;;

  …省略其他分支…

  *)

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

    ;;

esac                                              这个是倒着写case 。。。。。魔幻的语法

注意事项:

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

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

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

2.案例实操

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

[atguigu@hadoop101 datas]$ touch case.sh

[atguigu@hadoop101 datas]$ vim case.sh

 

!/bin/bash

 

case $1 in

"1")

        echo "banzhang"

;;

 

"2")

        echo "cls"

;;

*)

        echo "renyao"

;;

esac

 

[atguigu@hadoop101 datas]$ chmod 777 case.sh

[atguigu@hadoop101 datas]$ ./case.sh 1

1

0_13 for 循环

1.基本语法1

for (( 初始值;循环控制条件;变量变化 ))

   do

      程序

  done

2.案例实操

(1)从1加到100

[atguigu@hadoop101 datas]$ touch for1.sh

[atguigu@hadoop101 datas]$ vim for1.sh

 

#!/bin/bash

 

s=0

for((i=0;i<=100;i++))

do

        s=$[$s+$i]                           使用前面定义过的变量,给变量加$符号就行

done

echo $s

 

[atguigu@hadoop101 datas]$ chmod 777 for1.sh

[atguigu@hadoop101 datas]$ ./for1.sh

“5050”

3.基本语法2

for 变量 in 值1 值2 值3…

  do

    程序

  done

4.案例实操

       (1)打印所有输入参数

[atguigu@hadoop101 datas]$ touch for2.sh

[atguigu@hadoop101 datas]$ vim for2.sh

 

#!/bin/bash

#打印数字

 

for i in $*

    do

      echo "ban zhang love $i "

    done

 

[atguigu@hadoop101 datas]$ chmod 777 for2.sh

[atguigu@hadoop101 datas]$ bash for2.sh cls xz bd

ban zhang love cls

ban zhang love xz

ban zhang love bd

(2)比较$*和$@区别

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

[atguigu@hadoop101 datas]$ touch for.sh

[atguigu@hadoop101 datas]$ 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

 

[atguigu@hadoop101 datas]$ bash for.sh cls xz bd

ban zhang love cls

ban zhang love xz

ban zhang love bd

ban zhang love cls

ban zhang love xz

ban zhang love bd

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

[atguigu@hadoop101 datas]$ 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

 

[atguigu@hadoop101 datas]$ chmod 777 for.sh

[atguigu@hadoop101 datas]$ bash for.sh cls xz bd

ban zhang love cls xz bd

ban zhang love cls

ban zhang love xz

ban zhang love bd

0_14  while 循环

1.基本语法

while [ 条件判断式 ]

  do

    程序

  done

2.案例实操

       (1)从1加到100

[atguigu@hadoop101 datas]$ touch while.sh

[atguigu@hadoop101 datas]$ vim while.sh

 

#!/bin/bash

s=0

i=1

while [ $i -le 100 ]

do

        s=$[$s+$i]

        i=$[$i+1]

done

 

echo $s

 

[atguigu@hadoop101 datas]$ chmod 777 while.sh

[atguigu@hadoop101 datas]$ ./while.sh

 

shell学习

上一篇:Linux应知应会(一)


下一篇:解决Hbuliderx的代码不能自动补全的问题