Bash-shell--回顾篇

Bash-shell详解

    • 数值测试
      • 数值测试案例
    • 字符串测试
      • 字符串测试案例
    • 文件测试
      • 存在性测试
      • 存在性及类型测试
      • 文件权限测试
      • 特殊权限测试
      • 文件是否有内容
      • 时间戳
      • 从属关系测试
      • 双目测试
    • 组合测试条件
      • 逻辑运算
      • 测试案例
    • 变量
      • 位置变量
        • 参考案例:
      • 特殊变量
        • 参考案例
    • if判断语句
      • 单分支
        • 测试案例
      • 双分支
        • 测试案例
      • 练习案例

数值测试

       	-eq:是否等于;  
		-ne:是否不等于;
		-gt:是否大于;
		-ge:是否大于等于;
		-lt:是否小于;
		-le:是否小于等于;

数值测试案例

[root@xuegod120 ~]# [ 2 -eq 3 ]
[root@xuegod120 ~]# echo $?
1
[root@xuegod120 ~]# [ 2 -ne 3 ]
[root@xuegod120 ~]# echo $?
0
[root@xuegod120 ~]# [ 2 -gt 3 ]
[root@xuegod120 ~]# echo $?
1
[root@xuegod120 ~]# [ 2 -ge 3 ]
[root@xuegod120 ~]# echo $?
1
[root@xuegod120 ~]# [ 2 -lt 3 ]
[root@xuegod120 ~]# echo $?
0
[root@xuegod120 ~]# [ 2 -le 3 ]
[root@xuegod120 ~]# echo $?
0	

字符串测试

		==:是否等于;
		>:是否大于;
		<:是否小于;
		!=:不等于;
		=~:左侧字符串是否能够被右侧的PATTERN匹配;
		-z "STRING":判定指定的字符串是否为空,空则为真,不空则为假;
		-n "STRING":判定指定的字符串是否不空,不空则为真,空则为假;
		注意:字符串测试需要加引号;
		           需要使用双中括号;

字符串测试案例

        [root@xuegod120 ~]# [[ "name" = "name" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ "name" = "$name" ]]
		[root@xuegod120 ~]# echo $?
		1
		[root@xuegod120 ~]# [[ "a" > "b" ]]
		[root@xuegod120 ~]# echo $?
		1
		[root@xuegod120 ~]# [[ "a" < "b" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ "a" != "b" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ "abc" =~ "o" ]]
		[root@xuegod120 ~]# echo $?
		1
		[root@xuegod120 ~]# [[ "abc" =~ "a" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ -z "123" ]]
		[root@xuegod120 ~]# echo $?
		1
		[root@xuegod120 ~]# [[ -z "" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ -n "123" ]]
		[root@xuegod120 ~]# echo $?
		0
		[root@xuegod120 ~]# [[ -n "" ]]
		[root@xuegod120 ~]# echo $?
		1

文件测试

存在性测试

-a FILE 判断文件是否存在,存在为真,否则为假;
-e FILE 判断文件是否存在,存在为真,否则为假;

存在性及类型测试

-b FILE:是否存在并且为块设备文件;
-c FILE:是否存在并且为字符串文件;
-d FILE:是否存在并且为目录文件;
-f FILE:是否存在并且为普通文件;
-h FILE或-L FILE:是否存在并且为符号链接文件;
-p FILE:是否存在并且为管道文件;
-S FILE:是否存在并且为套接字文件;

文件权限测试

-r FILE:是否存在并且对当前用户可读;
-w FILE:是否存在并且对当前用户可写;
-x FILE:是否存在并且对当前用户可执行;

特殊权限测试

-u FILE:是否存在并且拥有suid权限;
-g FILE:是否存在并且拥有sgid权限;
-k FILE:是否存在并且对当前用户可执行;

文件是否有内容

-s FILE:是否有内容

时间戳

-N FILE:文件自从上一次读取后是否被修改;

从属关系测试

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

双目测试

FILE1 -ef FILE2:FILE1与FILE2是否指向同一个文件的Inode号;
FILE1-nt FILE2:FILE1修改时间是否大于FILE2;
FILE1 -ot FILE2:FILE1修改时间是否小于FILE2;

组合测试条件

逻辑运算

方式一:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
[ -O FILE ] && [ -a FILE ]

方式二:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ] #FILE是否为文件属主并且有执行权限

测试案例

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

[root@cvm-10_4_2_54 ~]# [ -z "$hostname" -o "$hostname"=="localhost.localdomain" -o "$hostname"=="localhost" ] && hostnamectl zx.com

变量

位置变量

$1,$2, 2... 2... 2...{10},${11}… #位置参数变量
shift [n] #位置参数左移,默认每次传递后向左移动一位,[n] 可以自定义左移的位数

参考案例:

[root@cvm-10_4_2_54 scripts]# cat file1.sh 
#!/bin/bash
#
echo "The first parameter is $1: "
echo "The second parameter is $2: "
[root@cvm-10_4_2_54 scripts]# sh file1.sh 1 2
The first parameter is 1: 
The second parameter is 2: 
[root@cvm-10_4_2_54 scripts]# cat file2.sh 
#!/bin/bash
#
echo $1
shift
echo $1
[root@cvm-10_4_2_54 scripts]# sh file2.sh 1 2
1
2

特殊变量

$0:脚本文件路径本身
$#:脚本传参的个数
$*:所有参数
$@:所有参数

参考案例

[root@cvm-10_4_2_54 scripts]# cat file3.sh 
#!/bin/bash
#
echo $0
echo $#
echo $*
echo $@
[root@cvm-10_4_2_54 scripts]# sh file3.sh 1 2 3 
file3.sh
3
1 2 3
1 2 3

if判断语句

单分支

语法:
if 测试条件
then
代码分支
fi
或者
if 测试条件; then
代码分支
fi

测试案例

[root@cvm-10_4_2_54 scripts]# cat file4.sh 
#!/bin/bash
#
if [ $1 > $2 ]; then
   echo max is $1
fi

if [ $1 < $2 ]
then
   echo max is $2
fi
[root@cvm-10_4_2_54 scripts]# sh file4.sh 4 5
max is 4
max is 5

双分支

语法:
if 测试条件; then
条件为真执行分支
else
条件为假执行分支
fi

测试案例

[root@cvm-10_4_2_54 scripts]# cat file5.sh 
#!/bin/bash
#
if [ $1 > $2 ]; then
   echo max is $1
else
   echo min is $2
fi
[root@cvm-10_4_2_54 scripts]# sh file5.sh 6 8
max is 6

练习案例

练习1:通过命令行参数给定两个数字,输出其中较大的数值;

[root@cvm-10_4_2_54 scripts]# cat file5.sh 
#!/bin/bash
#
if [ $1 > $2 ]; then
   echo max is $1
else
   echo min is $2
fi
[root@cvm-10_4_2_54 scripts]# sh file5.sh 6 8
max is 6

练习2:通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数;

[root@cvm-10_4_2_54 scripts]# cat file6.sh 
#!/bin/bash
#
id_num=`id -u $1`
Num=$[ $id_num % 2 ]
if [ $Num -eq 0 ]; then
   echo "Even Number"
else
   echo "Odd Number"
fi
[root@cvm-10_4_2_54 scripts]# sh file6.sh root
Even Number
[root@cvm-10_4_2_54 scripts]# sh file6.sh abrt
Odd Number

练习3:通过命令行参数给定两个文件名,返回每个文件的行数,并说明其中行数较多的文件;

[root@cvm-10_4_2_54 scripts]# cat file7.sh 
#!/bin/bash
#
id1=`cat $1 | wc -l`
id2=`cat $2 | wc -l`
echo "$1 行数是:$id1"
echo "$2 行数是:$id2"
if [ id1 > id2 ];then
   echo "$1为行数较多的文件"
else
   echo "$2为行数较多的文件"
fi
[root@cvm-10_4_2_54 scripts]# sh file7.sh /etc/passwd /etc/ssh/sshd_config 
/etc/passwd 行数是:26
/etc/ssh/sshd_config 行数是:139
/etc/passwd为行数较多的文件

你可能感兴趣的:(Linux回顾篇)