欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 06_01 _bash脚本编程之四 整数测试及特殊变量 有大用

练习:写一个脚本

判断当前系统上是否有用户的默认shell为bash:

    如果有,就显示其中一个的用户名:否则,就显示没有这类用户


#!/bin/bash


if  grep '\<bash$' /etc/passwd &> /dev/null ; then

#  echo "have bash user"

  echo `grep "\<bash$" /etc/passwd | head -1 | cut -d: -f1`

else

  echo "no bash user"

fi


练习:写一个脚本

给定一个文件,比如 /etc/inittab

判断这个文件中是否有空白行:

如果有,则显示其空白行数,否则,显示没有空白行.


#!/bin/bash

#

FILE=~/space.txt

if grep "^$" $FILE &>/dev/null; then

  echo `grep "^$" $FILE | wc -l`

else

  echo "no space"

fi



#!/bin/bash

A=`grep '^$' /etc/inittab | wc -l`

if [ $A -gt 0 ]; then

    echo "$A"

else

    echo "meiyoukongbaihang"

fi


-- by 张帅

#!/bin/bash

FILE=/etc/inittab

if [ ! -e $FILE ]; then

    echo "No $FILE."

    exit 8    #只要不是0,就是非正常退出

fi



#!/bin/bash

#

FILE=/etc/aaaaa

if [ -e $FILE ]; then

  echo "$FILE is a file"

else

  echo "$FILE is not a file"

  exit 8 #只要不是0,就是非正常退出

fi


if grep "^$" $FILE &> /dev/null; then

    echo "Total blank lines: `grep "^$" $FILE | wc -l ` /"

else

    echo "No blank line."

fi


进一步要求: 给一个用户名,不使用id命令获得 其id号:

#!/bin/bash

#

FILE=/etc/passwd

USERNAME=aaaa

if ! grep "^$USERNAME\>" $FILE &> /dev/null; then

  echo "$USERNAME not exist"

  exit 9

fi

USERID=`grep "^$USERNAME\>" $FILE | cut -d: -f3`

echo $USERID




判断一个用户 看uid 与 gid 是否相等  ,相等的话 就输出 good guy 否则的话输出 bad guy


#!/bin/bash

#

USERNAME=user109

FILE=/etc/passwd

if ! grep "^$USERNAME\>" $FILE  &> /dev/null; then

  echo "$USERNAME not exist!"

  exit 8

fi


RESULT=`grep "^$USERNAME\>" $FILE | cut -d: -f3,4`

USERID=`echo $RESULT | cut -d: -f1`

GROUPID=`echo $RESULT | cut -d: -f2`

if [ $USERID -eq $GROUPID ]; then

  echo "good buy"

else

  echo "bad buy"

fi



#!/bin/bash

#

USERNAME=user1

if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then

    echo "No such user: $USERNAME."

    exit 1

fi

USERID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`

GROUPID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f4`

if [ $USERNAME -eq $GROUPID ]; then

    echo "Good guy"

else 

    echo "Bad guy"

fi






练习:写一个脚本


判定命令历史中历史命令的总条目是否大于1000,

如果大于,则显示"some command will gone.".否则显示ok



exit 提交结束脚本的命令 退出脚本(退出脚本进程) (退出是有结果和状态结果,

如果 exit 不指定状态结果,就是 exit上面的那个命令的执行状态结果,作为脚本的执行状态结果)

 exit #数值  (值的范围是 0-255)


练习:写一个脚本

给定一个用户,获取其密码警告期限:

而后判断用户密码剩余使用期限是否已经小于警告期限:

    提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限

    如果小于,则显示|"Warning";否则,就显示"OK"


圆整:丢弃小数点后的所有内容




测试表达式

    [ expression ] 中括号前后必须有空格 命令测试法(实际上就是bash的命令)

    [[ expression ]]  关键字测试法

    test expression

bash中常用的条件测试有三种

    整数测试:  (双目操作) (通常情况下 前面是变量 后面是数值或变量,但是直接两个数比较也可以的)

        -gt

        -le

        -ne

        -eq

        -ge

        -lt

INT1=63

INT2=77

[ $INT1 -eq $INT2 ]  记住目前学过的只有比较两个数值大小的时候 才能用中括号

[[ $INT1 -eq $INT2 ]]

test $INT1 -eq $INT2

上面三种都可以


if  grep "^$USERNAME\>" /etc/passwd ; then   因为 if 后直接就是取的这个命令的状态结果

 if  [ `grep "^$USERNAME\>" /etc/passwd | cut -d: -f3` -eq 0 ] ; then    这样子是可以的 判断的是用户的id 是不是等于 0 

 if   `grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`  ; then   如果不是管理员 取的值是非0值,都为假,虽然表达式不错,但我们一般不这么用


文件测试:

-e FILE:测试文件是否存在

-f FILE:测试文件是否为普通文件

-d FILE:测试指定路径是否为目录 文件夹

-r FILE:测试当前用户(执行这个脚本的用户)对指定文件是否有读权限

-w FILE:测试当前用户(执行这个脚本的用户)对指定文件是否有写权限

-x FILE:测试当前用户(执行这个脚本的用户)对指定文件是否有执行权限


[ -e /etc/inittab ] 指定这个文件是否存在

[ -x /etc/rc.d/rc.sysinit ] 当前用户(执行这个脚本的用户)对/etc/rc.d/rc.sysinit是否有执行权限


单分支if语句

if 判断条件; then              (then与if 同一行分号不能少;then可以为下一行,分号可以少)(判断条件,可以是整数测试比较,也可以是某个命令的执行状态的返回值,只要是逻辑,或布尔值的返回值就行,只能为真,或者为假,在linux中,0为真,其它数值一律为假,这个0,一定是命令执行状态返回值,0表示执行成功)

    statement1

    statement2

    ...

fi                                      (fi是if的反过来)


双分支的if语句

if 判断条件; then

    statement1

    statement2

    ...

else

    statement3

    statement4

    ...

fi



多分支的if语句

if 判断条件1; then

    statement1

    ...

elif 判断条件2; then

    statement2

    ...

elif 判断条件3; then

    statement3

    ...

else

    statement4

    ...

fi


测试脚本是否有语法错误

bash -n 脚本文件


bash -x 脚本文件:单步执行  把执行的每个步骤,到底执行哪个命令 通通给执行出来


bash 变量的类型:

    本地变量

    环境变量

    位置变量: 

        $1 , $2 ,..... (脚本中引用命令的作用对象) 选项是修正命令的执行特性的 参数是命令的作用对象

        shift (特殊命令) (轮换,轮替) (踢出去)

    特殊变量:(有些地方叫系统变量)

        $?

        $#  美元号符井号参数的个数

        $*    美元符号星号参数列表

        $@   美元符号阿尔发号爱尔特号参数列表


./filetest.sh /etc/fstab /etc/inittab

$1 表示引用 第一个参数/etc/fstab

$2 表示引用 第二个参数/etc/inittab

    

练习:写一个脚本

能接受一个参数(文件路径)

判定:此参数如果是一个存在的文件,就显示有此文件,就显示 "ok",否则就显示"no such file"


#!/bin/bash

#

NUM=$#

if [ $NUM -lt 1 ]; then

  echo "Usage: ifexistfile.sh ARG1"

  exit 9

fi

if [ -e $1 ]; then

  echo "ok"

else

  echo "no such file"

fi


练习:写一个脚本

给脚本传递两个参数(整数)

显示此两者之和 之乘积 ( 要记得判断给的参数够不够)


#!/bin/bash

#

NUM=$#

if [ $NUM -lt 2 ]; then

  echo "Usage: calcnum.sh ARG1 ARG2"

  exit 8

fi

SUM=$[$1+$2]

JIE=$[$1*$2]

echo "sum: $SUM"

echo "jie: $JIE"





练习: 写一个脚本

给定一个文件,

如果这个文件不存在,就提前退出脚本

如果是一个普通文件就显示之

如果是一个目录,亦显示之

否则,此为无法识别之文件

#!/bin/bash

#

NUM=$#

if [ $NUM -lt 1 ]; then

  echo "Usage: ./judegfile.sh ARG1"

  exit 8

fi

if [ ! -e $1 ]; then

 echo "$1 file not exists"

 exit 9

fi

if [ -f $1 ]; then

  echo "$1 is a file"

elif [ -d $1 ]; then

  echo "$1 is a dir"

else

  echo "no know $1 file"

fi





定义脚本的退出状态码

exit: 退出脚本

exit #

如果脚本没有明确定义退出状态码,最后执行的一条命令的退出码即为脚本的退出状态码



image.png



[root@ebs-22618 ~]# history

image.png

[root@ebs-22618 ~]# history | wc -l

image.png

[root@ebs-22618 ~]# wc -l ~/.bash_history

image.png

[root@ebs-22618 ~]# echo $HISTSIZE

1000

[root@ebs-22618 ~]# echo $HISTFILESIZE

1000

image.png

[root@ebs-22618 ~]# history | tail -1

 1064  history | tail -1

[root@ebs-22618 ~]# history | tail -1 | cut -d' ' -f1


[root@ebs-22618 ~]# history | tail -1 | cut -d' ' -f2

1066

[root@ebs-22618 ~]#

image.png


image.png


[root@ebs-22618 ~]# nano filetest.sh

image.png

[root@ebs-22618 ~]# chmod +x filetest.sh

[root@ebs-22618 ~]# bash -n filetest.sh

filetest.sh: line 8: syntax error: unexpected end of file

image.png


[root@ebs-22618 ~]# nano filetest.sh

image.png

[root@ebs-22618 ~]# ./filetest.sh

image.png

[root@ebs-22618 ~]# bash -x filetest.sh

image.png

[root@ebs-22618 ~]# nano filetest.sh

image.png

[root@ebs-22618 ~]# ./filetest.sh

image.png


[root@ebs-22618 ~]# nano filetest2.sh

image.png

[root@ebs-22618 ~]# chmod +x filetest2.sh

[root@ebs-22618 ~]# ./filetest2.sh

image.png


[root@ebs-22618 ~]# nano filetest2.sh

image.png

[root@ebs-22618 ~]# ./filetest2.sh

image.png

[root@ebs-22618 ~]# echo $?

image.png

[root@ebs-22618 ~]# nano filetest2.sh

image.png

(如果没有指出退出状态码 ,那么最后一条语句的状态码,就是脚本返回的状态码)

[root@ebs-22618 ~]# ./filetest2.sh

Directory.

[root@ebs-22618 ~]# echo $?

0     (如果没有指出退出状态码 ,那么最后一条语句的状态码,就是脚本返回的状态码)

[root@ebs-22618 ~]#

image.png


[root@ebs-22618 ~]# nano filetest2.sh

image.png

[root@ebs-22618 ~]# ./filetest2.sh

No such file

[root@ebs-22618 ~]# echo $?

0

image.png

[root@ebs-22618 ~]# bash -x filetest2.sh

image.png


[root@ebs-22618 ~]# cat /etc/inittab  /etc/fstab /etc/issue

image.png


选项是修正命令的执行特性的 参数是命令的作用对象


[root@ebs-22618 ~]# nano filetest3.sh

image.png

[root@ebs-22618 ~]# chmod +x filetest3.sh

[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab

image.png

[root@ebs-22618 ~]# ./filetest3.sh /etc/fstabddd

image.png


[root@ebs-22618 ~]# ./filetest3.sh  (忘了给参数了)

image.png

[root@ebs-22618 ~]# bash -x filetest3.sh

image.png


[root@ebs-22618 ~]# nano filetest3.sh

image.png

[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab

image.png

[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab

image.png


[root@ebs-22618 ~]# nano filetest3.sh

image.png


[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab /etc

image.png


[root@ebs-22618 ~]# nano filetest3.sh

image.png

[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab /etc

image.png

[root@ebs-22618 ~]# nano filetest3.sh

image.png

[root@ebs-22618 ~]# ./filetest3.sh

image.png

[root@ebs-22618 ~]# ./filetest3.sh /etc/aa

image.png


[root@ebs-22618 ~]# nano shift.sh

image.png

[root@ebs-22618 ~]# ./shift.sh 1 2 3

image.png


[root@ebs-22618 ~]# help shift


shift 2 表示一下子踢掉2个,第三个就变成了第一个

image.png



[root@ebs-22618 ~]# nano shift.sh

image.png


[root@ebs-22618 ~]# ./shift.sh 1 2 3 4 5

image.png


[root@ebs-22618 ~]# nano calc.sh

image.png

#!/bin/bash

if [ $# -lt 2 ]; then

 echo "Usage: calc.sh ARG1 ARG2"

 exit 8

fi

echo "The sum is: $[$1+$2]"

echo "The prod is: $[$1*$2]"


[root@ebs-22618 ~]# chmod +x calc.sh

[root@ebs-22618 ~]# ./calc.sh 1

image.png

[root@ebs-22618 ~]# ./calc.sh 3 6

image.png




普通分类: