shell基本语法,shell中test命令用法详解

By admin in 美高梅手机版4858 on 2019年3月20日

一、变量

一、变量

shell基本语法,shell语法

一、变量

1.变量的命名规则:以字母或下划线开始,前边跟数字,字母或下划线,最棒不要随便命名,要做到看见变量名能猜出其意义

2.变量赋值: x=100

      echo $x

 删除变量:unset x

3.定义变量名的界限用大括号 

[[email protected]
~]# egon_salary=20000
[[email protected]
~]# echo ${egon_salary}yuan
20000yuan

4.bash中不用注脚数据类型,默许都以字符型

二、运算符

1.算术运算符:+ – * / %

[[email protected]
~]# echo $[5%2]
1

2.赋值运算符:=,+=,-=,*=,/=,%=

[[email protected]
~]# x=10
[[email protected]
~]# ((x+=1))
[[email protected]
~]# echo $x
11

3.涉嫌运算符:<,>,!=,==,>=,<=,||,&&

波及运算符常与(( ))连用,[]能够直达相同的结果,但((
))不能够判断二个文书的门类,判断文件类型须求求用到[],[]又和test命令效果一样

用$?查看命令执行结果,结果为0代表真,非0代表假

[[email protected]
~]# x=10
[[email protected]
~]# ((x>=8))
[[email protected]
~]# echo $?
0

4.shell里的总括器

事先说过用$[]能够举香港行政局地简单易行的演算,不过只要波及到小数的运算,就供给用到shell里面包车型地铁总结器了

率先要设置软件,yum install -y bc

[[email protected]
~]# res=$(echo ‘scale=2;1/3′ |bc -l |cut -d’.’ -f2)
[[email protected]
~]# echo ${res}%
33%

5.test 下令测试

  test 

     -n str 字符串长度不为零

     -z  str 字符串长度为零

     -b 文件存在且为块文件

     -d 文件存在且为目录文件

     -e 文件存在

     -f 文件存在且为普通文书

     -h 文件存在且为链接文件(同 -L)

     -s 文件存在且超越零字节

   文件之间的比较

    file1 -nt file2  file1 的创导时间比file2晚

    file1 -ot file2  file1 的开创时间比file2早  

   整数之间的可比

    int1 -ne int2 int1和int2不相等

    int1 -eq int2 int1和int2 相等

    int1 -lt int2  int1小于int2

    int1 -le int2 int1稍低于等于int2

    int1 -gt int2 int1大于int2

    int1 -ge int2 int1高于等于int2

  字符串之间比较

    str1 = str2 str1和str2相等

    str1 !=str2 str1和str2不相等

  表达式之间的相比较

    expression1 -a expression2  表明式1与表明式2都为真

    expression1 -o expression2 表明式1或宣布式2为真

6.测试举例

  数字比较测试:    

[[email protected] ~]# [[ 2 > 1 ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]# ((20>10))
[[email protected] ~]# echo $?
0
[[email protected] ~]# ((20<10))
[[email protected] ~]# echo $?
1

  字符串测试

[[email protected] ~]# [ "abc" = "abc" ]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ "abc" = "abc" ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]# (("abc" = "abc"))
[[email protected] ~]# echo $?
1

[[email protected] ~]# [[ a = a && 1 < 2 ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ a = a && 1 < 2 ]]
[[email protected] ~]# echo $?
0

[[email protected] ~]# (( a = a || 1 > 2 ))
[[email protected] ~]# echo $?
1
[[email protected] ~]# [[ a = a || 1 > 2 ]]
[[email protected] ~]# echo $?
0

单单比较数字,用(( ))

除此之外单纯数字之外的相比,用[[ ]]

③ 、流程序控制制

1.if 分支机构

  1)验证用户账号密码:

input your name : zhangcan
input password : 123
login successful
[[email protected] ~]# ./usertest.sh 
input your name : hha
input password : hag
user or password error

#! /bin/bash
user='zhangcan'
password='123'

read -p 'input your name : ' name
read -p 'input password : ' code
if [ $name = $user -a $code = $password ];then
        echo 'login successful'
else
        echo 'user or password error'
fi
~                                             

  2)判断战绩档次

#!/bin/bash 
#根据用户输入的成绩,判断所属档次,并输出给用户
read -p 'input your score : ' score
if  [ $score -ge 90 ];then
    echo '优秀'
elif [ $score -ge 70 -a $score -lt 90 ];then
    echo '良好'
elif [ $score -ge 60 -a $score -lt 70 ];then
    echo '及格'
elif [ $score -lt 60 ];then
    echo '较差'
fi

2.while循环    

  while(条件)

  do 

  命令

  done

以身作则:判断用户输入的公文是何连串型

#!/bin/bash
while :
do
    read -p 'input your file : ' file
    if [ -z $file ];then
        continue
    else
        break
    fi
done
if [ -f $file ];then
    echo "$file is regular file"
elif [ -b $file ];then
    echo "$file is block file"
elif [ -d $file ];then
    echo "$file is directory file"
else
    echo "$file type unkonw"
fi

3.for循环

shell基本语法,shell中test命令用法详解。  for i in {1..10}    
 #in前面不肯定是数字,只若是有再次来到结果的通令都可以

  do

  echo $i

  done

演示1:写1个剧本,测试子网内能够动用的IP

#!/bin/bash
for i in {1..50}
do
    ping -c1 192.168.16.$i &> /dev/null  # -c1表示ping一次
    if [ $? -ne 0 ];then
        echo "192.168.16.$i successful"
        echo "192.168.16.$i" >> ~/ipavailable.txt
    fi
done
~                

示范2:总结/dev下每一个文件类型的数额

#!/bin/bash
dir='/dev'
for i in $(ls $dir)
do
    if [ -h $dir/$i ];then
        ((link+=1))
    elif [ -f $dir/$i ];then
        (( rfile+=1))
    elif [ -d $dir/$i ];then
        ((directory+=1))
    elif [ -b $dir/$i ];then
        (( block+=1 ))
    else
        (( typeunknow+=1))
    fi
done
echo 'block' $block
echo 'regular file' $rfile
echo 'directory' $directory
echo 'link' $link
echo 'unknow' $typeunknow

4.嵌套巡回

以身作则1:输出三个九九乘法表

#!/bin/bash
for ((i=1;i<=9;i++))
do
    for ((j=1;j<=i;j++))
    do
        echo -n "$i*$j=$[$i*$j]"
    done
    echo
done

示范2:验证用户登陆账号密码,登陆成功后得以执行命令,当输入quit时退出

#!/bin/bash
user='zhangcan'
password='123'
tag=true
while $tag
do
    read -p 'input your name : ' name
    read -p 'input your password : ' code
    if [[ $name = $user ]] && [[ $code = $password ]];then
        echo 'login successful'
        while $tag
        do
            read -p '>>: ' cmd
            if [[ $cmd = 'quit' ]];then
                tag=false
            else
                $cmd
            fi
        done
    fi
done

 

 

                         

① 、变量
1.变量的命名规则:以字母或下划线起先,后边跟数字,字母或下划线,最棒不用随便命名,要做到看见…

test命令用法。成效:检查文件和比较值

1.变量的命名规则:以字母或下划线起先,后边跟数字,字母或下划线,最棒不用随便命名,要大功告成看见变量名能猜出其意义

1.变量的命名规则:以字母或下划线起初,后边跟数字,字母或下划线,最佳不要随便命名,要形成看见变量名能猜出其意思

  1)判断表达式

2.变量赋值: x=100

2.变量赋值: x=100

  if test  (表明式为真)

      echo $x

      echo $x

  if test !表达式为假

 删除变量:unset x

 删除变量:unset x

  test 表明式1 –a 表明式2                  五个表明式都为真

3.概念变量名的分界用大括号 

3.概念变量名的边界用大括号 

  test 表达式1 –o 表明式2                 八个表明式有一个为真

[root@bogon ~]# egon_salary=20000
[root@bogon ~]# echo ${egon_salary}yuan
20000yuan

[root@bogon ~]# egon_salary=20000
[root@bogon ~]# echo ${egon_salary}yuan
20000yuan

  2)判断字符串

4.bash中不用注脚数据类型,暗许都以字符型

4.bash中不要评释数据类型,暗中认可都是字符型

  test –n 字符串                                   字符串的尺寸非零

二、运算符

二、运算符

  test –z 字符串                                    字符串的长度为零

1.算术运算符:+ – * / %

1.算术运算符:+ – * / %

  test 字符串1=字符串2                    字符串相等

[root@bogon ~]# echo $[5%2]
1

[root@bogon ~]# echo $[5%2]
1

  test 字符串1!=字符串2               字符串不等

2.赋值运算符:=,+=,-=,*=,/=,%=

2.赋值运算符:=,+=,-=,*=,/=,%=

  3)判断整数

[root@bogon ~]# x=10
[root@bogon ~]# ((x+=1))
[root@bogon ~]# echo $x
11

[root@bogon ~]# x=10
[root@bogon ~]# ((x+=1))
[root@bogon ~]# echo $x
11

  test 整数1 –eq 整数2                        整数相等

3.涉及运算符:<,>,!=,==,>=,<=,||,&&

3.关系运算符:<,>,!=,==,>=,<=,||,&&

  test 整数1 –ge 整数2                        整数1不止等于整数2

关联运算符常与(( ))连用,[]可以达到同等的结果,但((
))无法断定二个文本的品类,判断文件类型必供给用到[],[]又和test命令效果等同

关系运算符常与(( ))连用,[]能够直达同等的结果,但((
))不能够判定一个文件的类型,判断文件类型必须要用到[],[]又和test命令效果同样

  test 整数1 –gt 整数2                         整数1过量整数2

用$?查看命令执行结果,结果为0代表真,非0代表假

用$?查看命令执行结果,结果为0代表真,非0代表假

  test 整数1 –le 整数2                         整数1稍低于等于整数2

[root@bogon ~]# x=10
[root@bogon ~]# ((x>=8))
[root@bogon ~]# echo $?
0

[root@bogon ~]# x=10
[root@bogon ~]# ((x>=8))
[root@bogon ~]# echo $?
0

  test 整数1 –lt 整数2                          整数1低于整数2

4.shell里的总计器

4.shell里的总括器

  test 整数1 –ne 整数2                        整数1不对等整数2

事先说过用$[]能够举行部分粗略的演算,不过要是涉嫌到小数的运算,就要求用到shell里面包车型地铁计算器了

此前说过用$[]能够进行一些简易的演算,可是一旦波及到小数的运算,就要求用到shell里面的总括器了

  4)判断文件

第②要设置软件,yum install -y bc

首先要设置软件,yum install -y bc

  test  File1 –ef  File2                           
五个公文具有相同的设备号和i结点号

[root@bogon ~]# res=$(echo ‘scale=2;1/3′ |bc -l |cut -d’.’ -f2)
[root@bogon ~]# echo ${res}%
33%

[root@bogon ~]# res=$(echo ‘scale=2;1/3′ |bc -l |cut -d’.’ -f2)
[root@bogon ~]# echo ${res}%
33%

  test  File1 –nt  File2                            文件1比文件2 新

5.test 指令测试

5.test 限令测试

  test  File1 –ot  File2                            文件1比文件2 旧

  test 

  test 

  test –b File                                          
文件存在并且是块设备文件

     -n str 字符串长度不为零

     -n str 字符串长度不为零

  test –c File                                          
文件存在并且是字符设备文件

     -z  str 字符串长度为零

     -z  str 字符串长度为零

  test –d File                                          
文件存在并且是目录

     -b 文件存在且为块文件

     -b 文件存在且为块文件

  test –e File                                           文件存在

     -d 文件存在且为目录文件

     -d 文件存在且为目录文件

  test –f File                                           
文件存在并且是正统文件

     -e 文件存在

     -e 文件存在

  test –g File                                          
文件存在并且是安装了组ID

     -f 文件存在且为普通文书

     -f 文件存在且为普通文书

  test –G File                                          
文件存在并且属于有效组ID

     -h 文件存在且为链接文件(同 -L)

     -h 文件存在且为链接文件(同 -L)

  test –h File                                          
文件存在并且是1个标记链接(同-L)

     -s 文件存在且超越零字节

     -s 文件存在且超过零字节

  test –k File                                          
文件存在并且安装了sticky位

   文件之间的相比较

   文件之间的相比

  test –b File                                          
文件存在并且是块设备文件

    file1 -nt file2  file1 的创始时间比file2晚

    file1 -nt file2  file1 的创办时间比file2晚

  test –L File                                          
文件存在并且是多个标志链接(同-h)

    file1 -ot file2  file1 的创始时间比file2早  

    file1 -ot file2  file1 的创设时间比file2早  

  test –o File                                          
文件存在并且属于有功效户ID

   整数之间的可比

   整数之间的可比

  test –p File                                          
文件存在并且是五个命名管道

    int1 -ne int2 int1和int2不相等

    int1 -ne int2 int1和int2不相等

  test –r File                                           
文件存在并且可读

    int1 -eq int2 int1和int2 相等

    int1 -eq int2 int1和int2 相等

  test –s File                                          
文件存在并且是1个套接字

    int1 -lt int2  int1小于int2

    int1 -lt int2  int1小于int2

  test –t FD                                            
文件讲述符是在二个极端打开的

    int1 -le int2 int1低于等于int2

    int1 -le int2 int1低于等于int2

  test –u File                                          
文件存在并且安装了它的set-user-id位

    int1 -gt int2 int1大于int2

    int1 -gt int2 int1大于int2

  test –w File                                         
文件存在并且可写

    int1 -ge int2 int1过量等于int2

    int1 -ge int2 int1胜出等于int2

  test –x File                                          
文件存在并且可进行

  字符串之间相比

  字符串之间相比较

  每个口径语句的根底都以判定哪些是真什么是假。是还是不是明白其工作规律将控制你编写的是材质一般的剧本依然你将引以为荣的剧本。

    str1 = str2 str1和str2相等

    str1 = str2 str1和str2相等

  Shell
脚本的能力时常被低估,但实则其力量的表述受制于脚本撰写者的能力。您明白得更加多,您就越能像变戏法似地撰写三个文书来使职责自动化和简化您的管理工科作。

    str1 !=str2 str1和str2不相等

    str1 !=str2 str1和str2不相等

  在 shell
脚本中开始展览的各类操作(除最简便易行的吩咐编组之外)都亟待检查规范。全体的
shell 脚本“逻辑” — 广义意义下的“逻辑” — 日常都足以分为以下三大类:

  表明式之间的可比

  表达式之间的可比

  if {condition exists} then …

    expression1 -a expression2  表明式1与表明式2都为真

    expression1 -a expression2  表达式1与表明式2都为真

  while {condition exists} do …

    expression1 -o expression2 表明式1或发布式2为真

    expression1 -o expression2 表明式1或发布式2为真

  until {condition exists} do …

6.测试举例

6.测试举例

  无论随后的操作是怎样,这么些依照逻辑的吩咐都注重判断一种规格是还是不是实际存在来控制继续的操作。test
命令是驱动在各类情景下都可以规定要判断的条件是还是不是存在的实用工具。由此,彻底驾驭这一个命令对于文章成功的
shell 脚本至关心珍视要。

  数字相比较测试:    

  数字比较测试:    

  工作规律

[root@bogon ~]# [[ 2 > 1 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((20>10))
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((20<10))
[root@bogon ~]# echo $?
1
[root@bogon ~]# [[ 2 > 1 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((20>10))
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((20<10))
[root@bogon ~]# echo $?
1

  test 命令最短的概念大概是评估贰个表明式;尽管基准为真,则赶回三个 0
值。要是表明式不为真,则赶回一个过量 0 的值 —
也得以将其名叫假值。检查最后所执行命令的情状的最便利方法是应用 $?
值。出于演示的目标,本文中的例子全体施用了这么些参数。

  字符串测试

  字符串测试

  test 命令期望在指令行中找到2个参数,当 shell
没有为变量赋值时,则将该变量视为空。那代表在处理脚本时,一旦脚本寻找的参数不存在,则
test 将报告该错误。

[root@bogon ~]# [ "abc" = "abc" ]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [[ "abc" = "abc" ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# (("abc" = "abc"))
[root@bogon ~]# echo $?
1

[root@bogon ~]# [[ a = a && 1 < 2 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [[ a = a && 1 < 2 ]]
[root@bogon ~]# echo $?
0

[root@bogon ~]# (( a = a || 1 > 2 ))
[root@bogon ~]# echo $?
1
[root@bogon ~]# [[ a = a || 1 > 2 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [ "abc" = "abc" ]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [[ "abc" = "abc" ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# (("abc" = "abc"))
[root@bogon ~]# echo $?
1

[root@bogon ~]# [[ a = a && 1 < 2 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [[ a = a && 1 < 2 ]]
[root@bogon ~]# echo $?
0

[root@bogon ~]# (( a = a || 1 > 2 ))
[root@bogon ~]# echo $?
1
[root@bogon ~]# [[ a = a || 1 > 2 ]]
[root@bogon ~]# echo $?
0

  当试图爱抚脚本时,您能够通过将富有参数包涵在双引号中来缓解那么些题材。然后
shell 将变量展开,要是变量没有值,那么将传递3个空值给
test。另一种方法是在脚本内扩充三个额外检查进程来判定是或不是设置了命令行参数。假设没有安装命令行参数,那么脚本会告诉用户紧缺参数,然后退出。大家会通过某个事例来更现实地证实全数这么些剧情。

无非相比较数字,用(( ))

唯有比较数字,用(( ))

  test 和 [ 命令

除去单纯数字之外的相比,用[[ ]]

除此而外单纯数字之外的可比,用[[ ]]

  虽然 Linux 和 UNIX
的各样版本中都含有 test 命令,但该命令有四个更常用的别称 —
左方括号:[。test 及其小名平常都足以在 /usr/bin 或 /bin
(取决于操作系统本子和供应商)中找到。

叁 、流程序控制制

叁 、流程序控制制

  当你使用左方括号而非 test
时,其后必须始终跟着二个空格、要评估的基准、三个空格和左边括号。右方括号不是任黄瀚西的小名,而是意味着所需评估参数的停止。条件两边的空格是必备的,那表示要调用
test,以分别于同一通常利用方括号的字符/形式匹配操作。

1.if 分支机构

1.if 分支机构

  test 和 [ 的语法如下:

  1)验证用户账号密码:

  1)验证用户账号密码:

  test expression

input your name : zhangcan
input password : 123
login successful
[root@bogon ~]# ./usertest.sh 
input your name : hha
input password : hag
user or password error

#! /bin/bash
user='zhangcan'
password='123'

read -p 'input your name : ' name
read -p 'input password : ' code
if [ $name = $user -a $code = $password ];then
        echo 'login successful'
else
        echo 'user or password error'
fi
~                                             
input your name : zhangcan
input password : 123
login successful
[root@bogon ~]# ./usertest.sh 
input your name : hha
input password : hag
user or password error

#! /bin/bash
user='zhangcan'
password='123'

read -p 'input your name : ' name
read -p 'input password : ' code
if [ $name = $user -a $code = $password ];then
        echo 'login successful'
else
        echo 'user or password error'
fi
~                                             

  [ expression ]

  2)判断成绩档次

  2)判断成绩档次

  在那三种境况下,test 都评估2个表达式,然后回到真或假。若是它和
if、while 或 until
命令结合使用,则您可以对程序流实行广泛的支配。不过,您无需将 test
命令与别的别的组织一起使用;您能够从命令行直接运营它来检查大约任何事物的情景。

#!/bin/bash 
#根据用户输入的成绩,判断所属档次,并输出给用户
read -p 'input your score : ' score
if  [ $score -ge 90 ];then
    echo '优秀'
elif [ $score -ge 70 -a $score -lt 90 ];then
    echo '良好'
elif [ $score -ge 60 -a $score -lt 70 ];then
    echo '及格'
elif [ $score -lt 60 ];then
    echo '较差'
fi
#!/bin/bash 
#根据用户输入的成绩,判断所属档次,并输出给用户
read -p 'input your score : ' score
if  [ $score -ge 90 ];then
    echo '优秀'
elif [ $score -ge 70 -a $score -lt 90 ];then
    echo '良好'
elif [ $score -ge 60 -a $score -lt 70 ];then
    echo '及格'
elif [ $score -lt 60 ];then
    echo '较差'
fi

  因为它们互相互为别称,所以利用 test 或 [
均要求叁个表明式。表明式一般是文本、数字或文件和目录属性的相比较,并且能够分包变量、常量和平运动算符。运算符能够是字符串运算符、整数运算符、文件运算符或布尔运算符
— 大家将在偏下各部分每一种介绍每种运算符。

2.while循环    

2.while循环    

  test 文件运算符

  while(条件)

  while(条件)

  利用这么些运算符,您能够在程序中依据对文件类型的评估结果实施不一的操作:

  do 

  do 

  -b file 即使文件为二个块卓越文件,则为真

  命令

  命令

  -c file 假诺文件为贰个字符特殊文件,则为真

  done

  done

  -d file 假诺文件为三个目录,则为真

以身作则:判断用户输入的文书是何种类型

以身作则:判断用户输入的公文是何连串型

  -e file 假设文件存在,则为真

#!/bin/bash
while :
do
    read -p 'input your file : ' file
    if [ -z $file ];then
        continue
    else
        break
    fi
done
if [ -f $file ];then
    echo "$file is regular file"
elif [ -b $file ];then
    echo "$file is block file"
elif [ -d $file ];then
    echo "$file is directory file"
else
    echo "$file type unkonw"
fi
#!/bin/bash
while :
do
    read -p 'input your file : ' file
    if [ -z $file ];then
        continue
    else
        break
    fi
done
if [ -f $file ];then
    echo "$file is regular file"
elif [ -b $file ];then
    echo "$file is block file"
elif [ -d $file ];then
    echo "$file is directory file"
else
    echo "$file type unkonw"
fi

  -f file 假如文件为两个普普通通文书,则为真

3.for循环

3.for循环

  -g file 假若设置了文本的 SGID 位,则为真

  for i in {1..10}    
 #in后边不必然是数字,只假如有再次来到结果的一声令下都足以

  for i in {1..10}    
 #in前边不自然是数字,只假使有重临结果的一声令下都得以

  -G file 即使文件存在且归该组全数,则为真

  do

  do

  -k file 借使设置了文件的粘着位,则为真

  echo $i

  echo $i

  -O file 若是文件存在并且归该用户拥有,则为真

  done

  done

  -p file 假诺文件为三个命名管道,则为真

演示1:写一个剧本,测试子网内能够使用的IP

示范1:写多个本子,测试子网内能够运用的IP

  -r file 要是文件可读,则为真

#!/bin/bash
for i in {1..50}
do
    ping -c1 192.168.16.$i &> /dev/null  # -c1表示ping一次
    if [ $? -ne 0 ];then
        echo "192.168.16.$i successful"
        echo "192.168.16.$i" >> ~/ipavailable.txt
    fi
done
~                
#!/bin/bash
for i in {1..50}
do
    ping -c1 192.168.16.$i &> /dev/null  # -c1表示ping一次
    if [ $? -ne 0 ];then
        echo "192.168.16.$i successful"
        echo "192.168.16.$i" >> ~/ipavailable.txt
    fi
done
~                

  -s file 假若文件的长短不为零,则为真

以身作则2:总计/dev下种种文件类型的数码

以身作则2:计算/dev下每种文件类型的多寡

  -S file 如若文件为二个套接字特殊文件,则为真

#!/bin/bash
dir='/dev'
for i in $(ls $dir)
do
    if [ -h $dir/$i ];then
        ((link+=1))
    elif [ -f $dir/$i ];then
        (( rfile+=1))
    elif [ -d $dir/$i ];then
        ((directory+=1))
    elif [ -b $dir/$i ];then
        (( block+=1 ))
    else
        (( typeunknow+=1))
    fi
done
echo 'block' $block
echo 'regular file' $rfile
echo 'directory' $directory
echo 'link' $link
echo 'unknow' $typeunknow
#!/bin/bash
dir='/dev'
for i in $(ls $dir)
do
    if [ -h $dir/$i ];then
        ((link+=1))
    elif [ -f $dir/$i ];then
        (( rfile+=1))
    elif [ -d $dir/$i ];then
        ((directory+=1))
    elif [ -b $dir/$i ];then
        (( block+=1 ))
    else
        (( typeunknow+=1))
    fi
done
echo 'block' $block
echo 'regular file' $rfile
echo 'directory' $directory
echo 'link' $link
echo 'unknow' $typeunknow

  -t fd 如若 fd 是四个与极端相连的打开的文书讲述符(fd 默许为
1),则为真

4.嵌套巡回

4.嵌套循环往复

  -u file 若是设置了文本的 SUID 位,则为真

演示1:输出一个九九乘法表

以身作则1:输出一个九九乘法表

美高梅手机版4858,  -w file 借使文件可写,则为真

#!/bin/bash
for ((i=1;i<=9;i++))
do
    for ((j=1;j<=i;j++))
    do
        echo -n "$i*$j=$[$i*$j]"
    done
    echo
done
#!/bin/bash
for ((i=1;i<=9;i++))
do
    for ((j=1;j<=i;j++))
    do
        echo -n "$i*$j=$[$i*$j]"
    done
    echo
done

  -x file 要是文件可实施,则为真

演示2:验证用户登陆账号密码,登陆成功后可以执行命令,当输入quit时退出

示范2:验证用户登陆账号密码,登陆成功后得以执行命令,当输入quit时退出

 

#!/bin/bash
user='zhangcan'
password='123'
tag=true
while $tag
do
    read -p 'input your name : ' name
    read -p 'input your password : ' code
    if [[ $name = $user ]] && [[ $code = $password ]];then
        echo 'login successful'
        while $tag
        do
            read -p '>>: ' cmd
            if [[ $cmd = 'quit' ]];then
                tag=false
            else
                $cmd
            fi
        done
    fi
done
#!/bin/bash
user='zhangcan'
password='123'
tag=true
while $tag
do
    read -p 'input your name : ' name
    read -p 'input your password : ' code
    if [[ $name = $user ]] && [[ $code = $password ]];then
        echo 'login successful'
        while $tag
        do
            read -p '>>: ' cmd
            if [[ $cmd = 'quit' ]];then
                tag=false
            else
                $cmd
            fi
        done
    fi
done

以下示例突显了此简单操作的周转状态:

 

 

  $ ls -l

 

 

  total 33

                         

                         

  drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST

  -rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan

  -rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah

  drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen

  -rw——- 1 emmett users 152 Feb 6 07:29 kristin

  -rw-r–r– 1 emmett users 152 Feb 6 07:29 spencer

  $

  $ test -r evan

  $ echo $?

  0

  $ test -r walter

  $ echo $?

  1

  $

  由于第贰回评估为真 — 文件存在且可读 — 重回值为真,或
0。由于第一回评估的文书不存在,该值为假,重返值不为零。将值钦命为零或非零很要紧,因为在失利时不会一向返回1(就算那是常见再次回到的值),或者回到三个非零值。

  正如开首所涉嫌的,除了采纳 test 外,您还足以用方括号 [ ]
将指令括住来向 shell 发出同样的命令 — 如下所示:

  $ [ -w evan ]

  $ echo $?

  0

  $ [ -x evan ]

  $ echo $?

  1

  $

  同样,第1个表明式为真,第②个表达式为假 —
正如再次来到值所提示的那么。您还足以使用以下命令将五个文件相互举办相比较:

  file1 -ef
file2 测试以判断三个文本是否与同一个装备源源,是不是持有同样的
inode 编号

  file1 -nt
file2 测试以判断第①个文件是或不是比第一个文件更新(由修改日期决定)

  file1 -ot file2
测试以判断第四个文本是不是比第①个文本更旧

  以下示例展现了利用那一个运算符相比文件的结果:

  $ [ evan -nt spencer ]

  $ echo $?

  0

  $ [ karen -ot spencer ]

  $ echo $?

  1

  $

  名为 evan 的文件比名为 spencer
的文书更新,因而评估为真。类似地,名为 karen 的文本比名为 spencer
的公文更新,因而该评估为假。

  字符串相比运算符

  如标题所示,那组函数相比较字符串的值。您能够检查它们是或不是存在、是还是不是一律只怕是不是分歧。

  String 测试以判断字符串是或不是不为空

  -n string 测试以咬定字符串是不是不为空;字符串必须为 test 所识别

  -z string 测试以判断字符串是不是为空;字符串必须为 test 所识别

  string1 = string2 测试以判断 string1 是或不是与 string2 相同

  string1 != string2 测试以咬定 string1 是或不是与 string2 分化

  对其它变量进行的最实惠的测试之一是判断它的值是或不是不为空,能够不难地将其放在
test 命令行中施行那种测试,如下例所示:

  $ test “$variable”

  强烈提议进行此种测试时用双引号将变量括住,以让 shell
识别变量(尽管变量为空)。私下认可意况下进行的基本字符串评估和 -n
测试从效益上讲是同样的,如以下示例所示:

  #example1

  if test -n “$1”

  then

  echo “$1”

  fi

  执行以上例子中的代码将基于 $1 是还是不是存在给出以下结果:

  $ example1 friday

  friday

  $

  $ example1

  $

  即便将代码更改为以下情势,则结果将同一:

  #example2

  if test “$1”

  then

  echo “$1”

  fi

  如下所示:

  $ example2 friday

  friday

  $

  $ example2

  $

  全数那一个注明,日常不需求 -n,它代表暗中同意操作。

  要从一个两样的角度来查阅种种大概,您能够用另一个选项来替换
-n,并检讨该值是不是为空(相对于非空)。那足以用 -z 选项来促成,代码为:

  #example3

  if test -z “$1”

  then

  echo “no values were specified”

  fi

  运营如下:

  $ example3

  no values were specified

  $ example3 friday

  $

  要是在未曾命令行参数的情况下运作该程序,而表达式评估为真,那么将执行顺序块中的文本。若是在命令行中有值,则脚本退出,不进行其余操作。将评估操作放在脚本的初阶非凡有用,那足以在恐怕产生错误的愈发处理在此以前先行检查变量值。

   
其余的字符串运算符对五个变量/字符串之间的确切匹配或内部的出入(您也能够叫做等价性和“不等价性”)举办业评比估。第①个例证对金童玉女实行测试:

 

  $ env

  LOGNAME=emmett

  PAGER=less

  SHELL=/bin/bash

  TERM=linux

  $

  $ [ “$LOGNAME” = “emmett” ]

  $ echo $?

  0

  $

  $ [ “$LOGNAME” = “kristin” ]

  $ echo $?

  1

  $

  或许,该评估能够以脚本的样式用于决定是或不是运维脚本:

  #example4

  if [ “$LOGNAME” = “emmett” ]

  then

  echo “processing beginning”

  else

  echo “incorrect user”

  fi

  那种格局能够用来寻找任意的值(如终端种类或 shell
类型),在同意脚本运转在此之前这么些值必须协作。请留意,= 或 !=
运算符的先期级高于其余大部分可钦定选项,且必要必须伴有表明式。由此,除了相比较字符串的抉择之外,=
或 !=
都不可能和检讨某种东西(如可读文件、可执行文件或目录)的存在性的选料一起使用。

  整数相比较运算符

  正如字符串比较运算符验证字符串相等或不一致一样,整数比较运算符对数字执行同样的成效。如若变量的值匹配则表明式测试为真,假设不般配,则为假。整数相比较运算符不处理字符串(正如字符串运算符不处理数字相同):

  int1 -eq int2 如果 int1 等于 int2,则为真

  int1 -ge int2 如若 int1 大于或等于 int2,则为真

  int1 -gt int2 如果 int1 大于 int2,则为真

  int1 -le int2 假若 int1 小于或等于 int2,则为真

  int1 -lt int2 如果 int1 小于 int2,则为真

  int1 -ne int2 如果 int1 不等于 int2,则为真

  以下示例彰显了1个代码段,当中在命令行中给出的值必须等于 7:

  #example5

  if [ $1 -eq 7 ]

  then

  echo “You’ve entered the magic number.”

  else

  echo “You’ve entered the wrong number.”

  fi

  运行中:

  $ example5 6

  You’ve entered the wrong number.

  $

  $ example5 7

  You’ve entered the magic number.

  $

  和字符串一样,比较的值能够是在脚本外为变量赋的值,而不要总是在命令行中提供。以下示例演示了贯彻那或多或少的一种办法:

  #example6

  if [ $1 -gt $number ]

  then

  echo “Sorry, but $1 is too high.”

  else

  echo “$1 will work.”

  fi

  $ set number=7

  $ export number

  $ example6 8

  Sorry, but 8 is too high.

  $ example6 7

  7 will work.

  $

  整数相比较运算符最棒的用处之一是评估钦赐的指令行变量的数码,并认清它是否切合所需求的科班。例如,假如有个别特定的授命只可以在有多个或更少变量的图景下运作,

  #example7 – display variables, up to three

  if [ “$#” -gt 3 ]

  then

  echo “You have given too many variables.”

  exit $#

  fi

  只要钦命多个或更少的变量,该示例脚本将符合规律运作(并再次回到值
0)。如若内定了多个以上的变量,则将显得错误消息,且例程将退出 —
同时重回与命令行中给定的变量数相等的脱离代码。

  对这一个进程进展改动能够用来在允许运营报表从前判断当天是或不是是本月的末段几天:

  #example8 – to see if it is near the end of the month#

  set `date` # use backward quotes

  if [ “$3” -ge 21 ]

  then

  echo “It is close enough to the end of the month to proceed”

  else

  echo “This report cannot be run until after the 21st of the month”

  exit $3

  fi

  在这么些事例中,设置了五个变量(通过空格相互分开):

  $1 = Fri

  $2 = Feb

  $3 = 6

  $4 = 08:56:30

  $5 = EST

  $6 = 2004

  那几个值可以在剧本中应用,就好像它们是在命令行中输入的同样。请留心,退出命令再次来到叁个值
— 在那种状态下,重临的值是从 $3
的值中取得的日期。这一技术在故障诊断时会相当实用 —
假若你认为脚本应该运转而从未运维,那么请查看 $? 的值。

  一种恍若的想法恐怕是编慕与著述一个只在种种月的首个周五运行的台本。第八个周四一定在该月的
15 日到 21 日时期。使用 cron,您能够调用脚本在 15 日到 22十一日中间每一天的一个点名时间运作,然后使用脚本的首先行检查
$1(在装置日期未来)的值是或不是为 Thu。假若为
Thu,那么执行剩下的本子,假使不是,则脱离。

  而另一个设法或者是,只同意脚本在跨越 6:00 p.m.
(18:00),全数用户都回家之后运维。只要撰写剧本,使其在值稍低于 18
时退出,并透过利用以下命令来赢得时间(将其设为 $1)

  set `date +%H`

 

 

布尔运算符

  布尔运算符在大概每个语言中的工作章程都一样 — 包罗 shell 脚本。在
nutshell
中,它们检查七个标准化为真或为假,只怕针对假的尺度而不是真的标准采纳操作。与
test 搭配使用的运算符有

  ! expr 固然表达式评估为假,则为真

  expr1 -a expr2 借使 expr1 和 expr2 评估为真,则为真

  expr1 -o expr2 只要 expr1 或 expr2 评估为真,则为真

  可以用 != 运算符代替 =
举办字符串评估。这是最不难易行的布尔运算符之一,对 test 的例行结果取非。

  其余四个运算符中的率先个是 -a(即
AND)运算符。要使测试最后为真,多少个表达式都必须评估为真。若是别的一个评估为假,则整个测试将评估为假。例如,

  $ env

  HOME=/

  LOGNAME=emmett

  MAIL=/usr/mail/emmett

  PATH=:/bin:/usr/bin:/usr/lbin

  TERM=linux

  TZ=EST5:0EDT

  $

  $ [ “$LOGNAME” = “emmett” -a “$TERM” =
“linux” ]

  $ echo $?

  0

  $

  $ [ “LOGNAME” = “karen” -a “$TERM” = “linux” ]

  $ echo $?

  1

  $

  在首先个评估中,七个规格都测试为真(在一个 linux 终端上登录的是
emmett),由此总体评估为真。在其次个评估中,终端检查无误但用户不得法,因而整个评估为假。

  一句话来说,AND
运算符能够保险代码只在多个规范都满意时才实施。相反,只要任何叁个表达式测试为真,OTucson(-o)
运算符即为真。我们来修改先前的例子,并将其内置二个剧本中来验证那或多或少:

  #example9

  if [ “$LOGNAME” = “emmett” -o “$TERM” = “linux” ]

  then

  echo “Ready to begin.”

  else

  echo “Incorrect user and terminal.”

  fi

  $ env

  HOME=/

  LOGNAME=emmett

  MAIL=/usr/mail/emmett

  PATH=:/bin:/usr/bin:/usr/lbin

  TERM=linux

  TZ=EST5:0EDT

  $ example9

  Ready to begin.

  $

  $ LOGNAME=karen

  $ example9

  Ready to begin.

  $

  在剧本第3遍运营时,评估判断用户是或不是等于 emmett。假诺发现用户等于
emmett,则脚本转至 echo 语句,并跳过别的的检查。它从不检查终端是或不是等于
linux,因为它只须要找到一条为实在语句就足以使任何运算为真。在剧本第②遍运行时,它判断用户不是
emmett,因而它将检查并发现终点确实是
linux。由于贰个尺度为真,脚本以后转至 echo
命令。为了引出第1条音讯,三个条件都必须为假。

  在原先规定时间是还是不是为月末的例证中,能够实施类似的自笔者批评来防范用户准备在星期二运营脚本:

  #example10 – Do not let the script run over the weekend#

  set `date` # use backward quotes

  if [ “$1” = “Sat” -o “$1” = “Sun” ]

  then

  echo “This report cannot be run over the weekend.”

  fi

  一些立见成效的演示

  示例
1:在剧本文件中出现的“逻辑”的最简便的方式(如本文全部示例中所示)是“if

then”语句。先前的三个代码段检查是还是不是留存一定数量的变量,然后将那个变量回显。假使我们对此稍微做一些改动,比如大家想回显变量,并且每趟回显均减去最左边的变量,以展示3个倒的三角形。

  即使那听起来不会细小略,但骨子里并非如此;那是您在执行大规模拍卖时想完毕的章程:处理第③个变量、转移、处理下3个变量……

  出于演示的目标,能够按以下办法撰写脚本中的首要行:

  #example11 – display declining variables, up to three

  if [ “$#” -gt 3 ] # see if more than three variables are given

  then

  echo “You have given more than three variables.”

  exit

  fi

  echo $*

  if test -n “$2”

  then

  shift

  echo $*

  fi

  if test -n “$2”

  then

  shift

  echo $*

  fi

  它将按以下办法履行:

  $ example11 one

  one

  $

  $ example11 one two

  one two

  two

  $

  $ example11 one two three

  one two three

  two three

  three

  $

  $ example11 one two three four

  You have given more than three variables.

  $

鉴于检查的指标将数据限制为多个变量的案由是缩减在例子中要反省的行数。一切都遵照地实行,即使它令人难以置信地混乱;用户因利用了跨越程序依设计所能处理的变量数而赢得警示,且脚本退出。若是变量数为
3 或更少,则运算的基本部分早先实践。

  回显变量,执行测试以查看另四个变量是或不是留存。假若另一个变量存在,则执行2遍转移,回显该变量,执行另一测试,等等。总共使用了
16 个有效行,而先后仅能处理不超过三个变量 —
分外混乱。借使消除变量数的限量,程序可以处理任意数量的变量。经过一些修改,脚本被减少(美化)了,并能处理任意数量的变量:

  #example12 – display declining variables, any number

  while [ “$#” -gt 0 ]

  do

  echo $*

  shift

  done

  $ example12 1 2 3 4 5 6 7 8 9 0

  1 2 3 4 5 6 7 8 9 0

  2 3 4 5 6 7 8 9 0

  3 4 5 6 7 8 9 0

  4 5 6 7 8 9 0

  5 6 7 8 9 0

  6 7 8 9 0

  7 8 9 0

  8 9 0

  9 0

  0

  今后缩减到唯有 5个有效行,且化解了第三个脚本多个变量的界定,并在运营时要更飞速。

  示例
2:无论曾几何时当在脚本内实施与处理有关的操作时,下1个操作将一贯检查上一操作的情况,以确认它已成功实现。您能够透过检查
$? 的场合并表明它卓殊 0
来兑现这一目标。例如,固然3个数据目录是不是能访问十三分主要,

  #example13

  TEMP=LST

  cd $TEMP

  if [ $?-ne 0 ]

  then

  echo “Data directory could not be found.”

  Exit

  fi

  处理错误

  资源

  下载针对 Linux
的 Oracle 数据库
10g

  Oracle 数据库 10g 第 1 版
(10.1.0.2) 未来可用于 Linux x86 和 Linux Itanium 平台;请在此从 OTN
上免费下载。

  访问 Linux 技术中央

  收藏本页,以赢得有关 Linux
系统管理员最棒应用的相似技术新闻,以及有关
Oracle-on-Linux
产品群的切实技术音讯。

  相关小说

  Linux 相关技能小说的存档

  test
命令日常出现的谬误事实上只有二种档次。第②种是未利用正确的评估项目,例如将字符串变量与整型变量进行比较大概将带填充的字符串与不带填充的字符串实行相比较。仔细评估您使用的变量将使你最后找到错误的发源,并让你能够消除那一个题材。

  第二种错误类型包罗将方括号误认为别名之外的某部东西。方括号与其情节之间必须有二个空格;不然,它们将不能够分解个中的指标。例如,

  $ [ “$LOGNAME” -gt 9]

  test:] missing

  $

  请留心,错误音讯提示 test 存在难题,即便使用了外号
]。那个标题很不难发觉,因为错误消息确切地将那个难点显得出来,然后你能够增添需要的空格。

  结论

  要在 shell
脚本中营造逻辑,您必须添加条件语句。每一条那种话语的主干都是对标准的评估,以咬定它是还是不是留存
— 通过行使 test 命令达成评估。精通它和它的外号(左方括号
([)的办事原理将使您能够撰写能够完毕都部队分犬牙相错操作的 shell 脚本

 

转载自:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有