linux学习31 运维核心技能-shell脚本逻辑判断和参数传递

一、bash脚本编程

  1、文件测试

    a、存在性测试

      -a FILE

      -e FILE

      文件的存在性测试,存在则为真,不存在则为假

[root@node1 ~]# [ -e /etc/rc.d/rc.sysinit ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -e /etc/rc.d/rc.local ]
[root@node1 ~]# echo $?
0

    b、存在性及类型测试

      -b FILE:是否存在并且为块设备文件

[root@node1 ~]# [ -b /dev/sda ]
[root@node1 ~]# echo $?
0

      -c FILE:是否存在并且为字符设备文件

      -d FILE:是否存在并且为目录文件

      -f FILE:是否存在并且为普通文件

      -h FILE或-L FILE:是否存在并且为符号链接文件

      -p FILE:是否存在且为命名管道文件

      -S FILE:是否存在且为套接字文件

    c、文件权限测试

      -r FILE:是否存在并且对当前用户可读;

      -w FILE:是否存在并且对当前用户可写

      -x FILE:是否存在并且对当前用户可执行

    d、特殊权限测试

      -u FILE:是否存在并且拥有suid权限

      -g FILE:是否存在并且拥有sgid权限

      -k FILE:是否存在并且拥有stlcky权限

    e、文件是否有内容

      -s FILE:文件是否有内容,有则为真,没有则为假

[root@node1 ~]# touch /tmp/testfile
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# echo "wohaoshuai" >> /tmp/testfile 
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
0

    f、对文件的时间戳做测试

      -N FILE:文件自从上一次读操作后是否被修改过

    g、从属关系测试

      -O FILE:当前用户是否为文件的属主

      -G FILE:当前有效用户是否属于文件的属组

    h、双目测试

      FILE1 -ef  FILE2:文件1和文件2是否为指向同一个文件系统上的相同inode的硬链接

      FILE1 -nt FILE2 :FILE1是否新于FILE2

      FILE1 -ot FILE2 :FILE1是否旧于FILE2

  2、组合测试条件

    a、逻辑运算

      第一种方式:

        COMMAND1 && COMMAND2

        COMMAND1 || COMMAND2

        !COMMAND

        [ -O FILE ] && [ -r FILE ]

      第二种方式:

        EXPRESSION1 -a  EXPRESSION2 #与运算

        EXPRESSION -o EXPRESSION2 #或运算

        !EXPRESSION

        [ -O FILE -a -x FILE ]

  3、练习:

    a、将当前主机名称保存至hostName变量中,主机名如果为空,或者为localhost.localdomain,则将其设置为www.wohaoshuai.com;

      hostName=$(hostname)

      [ -z "$hostName" -o "$hostName"=="localhost.localdomain" -o "$hostName"=="localhost" ] && hostname www.wohaoshuai.com

二、如何向脚本传递参数

  1、位置参数变量

    myscript.sh argu1 argu2

    a、引用方式:

      $1,$2,...${10},${11}...

[root@node1 script]# cat sum.sh 
#!/bin/bash
#
echo $[$1 + $2]
[root@node1 script]# bash sum.sh 2 3
5

    b、轮替。shift [n]:位置参数轮替。

[root@node1 script]# cat shift.sh 
#!/bin/bash
echo "First and second pos argu: $1,$2"
shift 2 #一脚踢掉两个参数,因此下一个参数又会从$1开始,如果不指定默认会踢掉一个
echo "Third pos argu $1"
[root@node1 script]# bash shift.sh one two three
First and second pos argu: one,two
Third pos argu three

    c、练习:写一个脚本,通过命令行传递两个文本文件路径给脚本,计算其空白行数之和

[root@node1 script]# cat lines.sh 
#!/bin/bash
file1_lines=$(grep "^$" $1|wc -l)
file2_lines=$(grep "^$" $2|wc -l)

echo "Total blank lines:$[$file1_lines+$file2_lines]"

[root@node1 script]# bash lines.sh /etc/fstab /etc/issue
Total blank lines:2

  2、特殊变量

    $0:脚本文件路径本身

[root@node1 script]# cat filename.sh 
#!/bin/bash
echo $0
[root@node1 script]# bash filename.sh 
filename.sh

    $#:显示参数个数

[root@node1 script]# cat pos.sh 
#!/bin/bash
echo "$1,$2"
echo $#
[root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
wohaoshuai1,wohaoshuai2
2
[root@localhost script]# cat lines.sh 
#!/bin/bash
[ $# -lt 2 ] && echo "At least two file" && exit 1
file1_lines=$(grep "^$" $1|wc -l)
file2_lines=$(grep "^$" $2|wc -l)

echo "Total blank lines:$[$file1_lines+$file2_lines]"
[root@localhost script]# bash lines.sh /etc/fstab 
At least two file
[root@localhost script]# echo $?
1

    $*:所有参数

      "hello"  "hi"  "toyou"

    $@:所有参数

      "hello hi toyou"

[root@node1 script]# cat pos.sh 
#!/bin/bash
echo "$1,$2"
echo $#
echo $*
echo $@
[root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
wohaoshuai1,wohaoshuai2
2
wohaoshuai1 wohaoshuai2
wohaoshuai1 wohaoshuai2

三、条件判断

  1、过程式编程语言的代码执行顺序

    a、顺序执行:逐条运行

    b、选择执行:

      代码有一个分支:条件满足时才会执行

      两个或以上的分支:只会执行其中一个满足条件的分支

    c、循环执行:

      代码片段(循环体)要执行0、1或多个来回

  2、相应写法

    a、选择执行

      (1)、单分支的if语句:

        if 测试条件;then

          分支

        fi

      (2)、双分支的if语句:

        if 测试条件; then

          条件为真实执行的分支

        else

          条件为假时执行的分支

        fi

      示例:通过参数传递一个用户名给脚本,此用户不存在时,则添加之

[root@localhost script]# cat useradd.sh 
#!/bin/bash
if ! grep "^$1\>" /etc/passwd &> /dev/null;then
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh hbase
Add user hbase finished.
[root@localhost script]# cat useradd.sh 
#!/bin/bash
if [ $# -lt 1 ];then
    echo "At least one username."
    exit 2
fi
if ! grep "^$1\>" /etc/passwd &> /dev/null;then
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh 
At least one username.
[root@localhost script]# echo $?
2
[root@localhost script]# cat useradd.sh 
#!/bin/bash
if [ $# -lt 1 ];then
    echo "At least one username."
    exit 2
fi
if  grep "^$1\>" /etc/passwd &> /dev/null;then
    echo "User $1 exists"
else
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh hbase
User hbase exists

  3、练习

    a、通过命令行参数给定两个数字,输出其中较大的数字

[root@localhost script]# cat big.sh 
#!/bin/bash
if [ $# -lt 2 ];then
    echo "Two intergers"
    exit 2 
fi
if [ $1 -ge $2 ];then
    echo "Max number; $1."
else
    echo "Max number; $2."
fi
[root@localhost script]# chmod +x big.sh 
[root@localhost script]# ./big.sh 4 6
Max number; 6.
[root@localhost script]# ./big.sh 4 
Two intergers
[root@localhost script]# cat big.sh 
#!/bin/bash
declare -i max 
if [ $# -lt 2 ]; then
    echo "Two intergers"
    exit 2 
fi
if [ $1 -ge $2 ];then
    max=$1
else
    max=$2
fi
echo $max
[root@localhost script]# bash big.sh 4 6
6

    b、通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数

    c、通过命令行参数给定两个文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;

你可能感兴趣的:(linux学习31 运维核心技能-shell脚本逻辑判断和参数传递)