自学linux——12.shell进阶

Shell进阶

当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行:

sed -i 's/\r$//' test10.sh(将\r替换成空白)

1.变量

(1)变量的含义

数据可以发生改变就是变量,在一个脚本周期(当前的shell文件)内,其值可以发生改变的量就是变量

(2)变量的定义与使用

        定义:变量是由  变量名=变量值  组成(a=”linux”)

        使用:用变量时一定要在变量名前面添加一个$符号(echo $a)

(3)变量名的规范

        变量名后面的“=”左右不能有空格

        命名只能使用英文字母,数字和下划线,首个字符不能是数字

        中间不能有空格,不能使用关键字,不能使用标点符号,可以使用下划线

(4)符号规则

双引号能够识别变量,能够实现转义(类似于乘“\*”)

单引号不能识别变量,只会原样输出,是不能转义

反引号(esc键下方的那个键“·”),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”(前后都加)

    eg1:使用变量改写入门脚本中的第1个shell脚本

           touch test3.sh           #创建文件

           vim  test3.sh            #编辑文件

           #!/bin/bash              #指定shell解释器

           a=”hello world!”       #定义变量

           echo $a                  #输出变量

           chmod u+x  test3.sh     #修改权限

           ./test3.sh                 #执行文件

eg2:定义一个变量,输出当前时间,格式为年-月-日,时-分-秒

           touch test4.sh           #创建文件

           vim  test4.sh            #编辑文件

           #!/bin/bash              #指定shell解释器

           b=`date “+%F %T”`     #定义变量

           echo $b                  #输出变量

           chmod u+x  test4.sh     #修改权限

           ./test4.sh                 #执行文件

(5)只读变量

 用法:readonly  变量名      只输出只读的变量

eg:定义变量a并且其值为10,随后设置其为只读变量,再重新赋值输出结果

          touch  test5.sh          #创建文件

       vim   test5.sh           #编辑文件

       #!/bin/bash              #指定shell解释器

      a=10                    #定义变量

      readonly a               #只读变量

      a=20                    #再次赋值

      echo $a                  #输出变量

      chmod 744 test5.sh      #修改权限

      ./test5.sh                #运行文件(输出10)

(6)接收用户输入

 用法:read  -p  提示信息  变量名

      eg:写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径)然后自动为用户创建改文件

           touch test6.sh           #创建文件

           vim  test6.sh            #编辑文件

           #!/bin/bash            #指定shell解释器

           read -p “请输入需要创建的路径” a     #接收用户输入

           touch $a                 #定义变量

           echo  $“文件创建成功!” #输出

           ls -l  $a                  #查看路径

           chmod 711 test6.sh       #修改权限

           ./test6.sh                 #运行文件

(7)删除变量

用法:unset 变量名

  eg:定义变量b=20,再输出b的值,随后删除b,最后再输出下b

        touch test7.sh          #创建文件

        vim  test7.sh           #编辑文件

        #!/bin/bash             #指定shell解释器

        b=20                   #定义变量

        echo $b                 #输出变量

        unset b                 #删除变量

        echo $b                 #输出变量

        chmod 711 test7.sh      #修改权限

2.条件判断语句

(1)    一个条件的语法

if condition

then

     command1

     command2

        …

fi

(2)    两个条件的语法

if condition

then

command1

command2

   …

                     else

                            command

                     fi

(3)    多个条件的语法

if condition1

then

command1

                     elif condition2

            then

                          command2

                     else

                            commandN

                     fi

              单行写法(一般在命令行中执行的时候):if [ condition ]; then command; fi

3.运算符

常见:算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符

(1)    算数运算符

假设变量a=10   变量b=20

运算符

说明

举例

+

加法

`expr $a + $b` 结果为 30。

-

减法

`expr $a - $b` 结果为 -10。

*

乘法

`expr $a \* $b` 结果为  200。

/

除法

`expr $b / $a` 结果为 2。

%

取余(不常用)

`expr $b % $a` 结果为 0。

=

赋值

a=$b 将把变量 b 的值赋给 a。

==

相等。用于比较两个数字,相同则返回 true(真)。

[ $a == $b ] 返回 false(假)。

!=

不相等。用于比较两个数字,不相同则返回 true。

[ $a != $b ] 返回 true。

条件表达式要放在方括号之间,并且要有空格

注意:expr 是一款表达式计算工具,使用它能完成表达式的求值操作

         表达式和运算符之间要有空格

完整的表达式要被 ` ` (反引号)包含

单引号的内容属于引用,会被完整输出

      eg:输出上表格中的各个表达式的结果

             touch   test8.sh

             vim    test8.sh

             #!/bin/bash

             a=10

                b=20

echo ‘a=’$a

             echo ‘b=’$b

             echo  ‘a + b =’ `expr $a + $b`

             echo  ‘a - b =’ `expr $a - $b`

             echo  ‘a * b =’ `expr $a \* $b`

             echo  ‘b / a =’ `expr $b / $a`

             echo  ‘b % a =’ `expr $b % $a`

             if [$a == $b]

             then

                 echo ‘ture’

             else

                 echo ‘false’

             fi

             if [$a != $b]

             then

                 echo ‘ture’

             else

                 echo ‘false’

             fi

             chmod  711 test8.sh

             ./test8.sh

(2)    关系运算符

     关系运算符只支持数字,不支持字符串,除非字符串的值是数字

假设变量a=10   变量b=20

运算符

说明

举例

-eq

检测两个数是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

检测两个数是否相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

检测左边的数是否大于右边的,如果是,则返回 true。

[ $a -gt $b ] 返回 false。

-lt

检测左边的数是否小于右边的,如果是,则返回 true。

[ $a -lt $b ] 返回 true。

-ge

检测左边的数是否大于等于右边的,如果是,则返回 true。

[ $a -ge $b ] 返回 false。

-le

检测左边的数是否小于等于右边的,如果是,则返回 true。

[ $a -le $b ] 返回 true。

eg:输出上表格中的各个表达式的结果

       touch test9.sh

       vim  test9.sh

       a=10

       b=20

       echo ‘a=’$a

       echo ‘b=’$b

       if [ $a -eq $b ]    #其他运算同理

       then

            echo ‘ture’

       else

            echo ‘false’

        fi

       chmod +x test9.sh

       ./test9.sh

 

(3)    逻辑运算符——布尔运算符

假设变量a=10   变量b=20

运算符

说明

举例

!

非运算,表达式为 true 则返回 false,否则返回 true。

[ ! false ] 返回 true。

-o

或(或者)运算,有一个表达式为 true 则返回 true

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与(并且)运算,两个表达式都为 true 才返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

或运算:一个为真即为真,全部为假才是假

与运算:一个为假即为假,全部为真才是真

eg:输出上表格中的各个表达式的结果

             touch  test12.sh

             vim test12.sh

             #!/bin/bash

       a=10

       b=20

       echo ‘a=’$a

       echo ‘b=’$b

       if [ ! false ]

       then

            echo ‘ture’

       else

            echo ‘false’

        fi

       if [ $a -lt 20 -o $b -gt 100 ]

       then

            echo ‘ture’

       else

            echo ‘false’

        fi

if [ $a -lt 20 -a $b -gt 100 ]

       then

            echo ‘ture’

       else

            echo ‘false’

        fi

       chmod +x test9.sh

       ./test9.sh

(4)    字符串运算符

假定变量 a 为 "abc",变量 b 为 "efg"

运算符

说明

举例

=

检测两个字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

检测两个字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

检测字符串长度是否为0,为0返回 true。

[ -z $a ] 返回 false。

-n

检测字符串长度是否为0,不为0返回 true。

[ -n $a ] 返回 true。

str

检测字符串是否为空,不为空返回 true。

[ $a ] 返回 true。

 

(5)    文件测试运算符

操作符

说明

举例

-b file

检测文件是否是块设备文件,如果是,则返回 true。

[ -b $file ] 返回 false。

-c file

检测文件是否是字符设备文件,如果是,则返回 true。

[ -c $file ] 返回 false。

-d file

检测文件是否是目录,如果是,则返回 true

[ -d $file ] 返回 false。

-f file

检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true

[ -f $file ] 返回 true。

-g file

检测文件是否设置了 SGID 位,如果是,则返回 true。

[ -g $file ] 返回 false。

-k file

检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

[ -k $file ] 返回 false。

-p file

检测文件是否是有名管道,如果是,则返回 true。

[ -p $file ] 返回 false。

-u file

检测文件是否设置了 SUID 位,如果是,则返回 true。

[ -u $file ] 返回 false。

-r file

检测文件是否可读,如果是,则返回 true

[ -r $file ] 返回 true。

-w file

检测文件是否可写,如果是,则返回 true

[ -w $file ] 返回 true。

-x file

检测文件是否可执行,如果是,则返回 true

[ -x $file ] 返回 true。

-s file

检测文件是否为空(文件大小是否大于0),不为空返回 true

[ -s $file ] 返回 true。

-e file

检测文件(包括目录)是否存在,如果是,则返回 true

[ -e $file ] 返回 true。

 

 

4.shell脚本附带选项

tail -10 test2.sh这种命令就是调用tail指令,系统把后续选项传递给tail,tail先去打开指定的文件,然后取出最后10行

接收用“$”加上选项对应的序号即可

eg1:编写test14.sh,传递a,b,c,输出其值

 

 

 

eg2:创建自定义指令“user”,可以直接执行,要求该指令具备以下语法和功能:

                 a. #user -add 用户名               【添加用户】

                 b. #user -del 用户名                【删除用户及其家目录】

 

 

c.创建自定义指令“user”——vim ~/.bashrc(su  切换用户生效)

 

 

posted @ 2020-11-26 22:12  叫我Ghost就好了  阅读(117)  评论(0)    收藏  举报