linux运维脚本参考,Linux运维之shell脚本基础知识

1、bash中的算术运算

let运算符

[root@:vg_adn_tidbCkhsTest~/tidb-bench/sysbench]#let i=1+2

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i3

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i1=10

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i2=20

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i3=$i1+$i2[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i330

$[expression]

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i1=$[11+22]

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i133

$((experssion))

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=$((22+33))[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i55

expr  arg1  操作符  arg2

[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=`expr 11 * 10`;echo $i110

一般情况下使用expr运算符都要用反引号

2、判断某个用户是否存在,如果不存在,则创建此用户

#!/bin/bash

id hadop&> /dev/null || useradd hadoop

3、计算passwd文件中第10个用户和第20个用户的UID之和

#!/bin/bash

uid1=$(id -u `cat /etc/passwd |head | tail -1|cut -d':' -f1`)

uid2=$(id -u `cat /etc/passwd |head -20| tail -1|cut -d':' -f1`)sum=$[$uid1+$uid2]echo "10 and 20 user 's uuid is $sum"

4、统计某个文件的空白行

[root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/init.d/functions | grep '^$'| wc -l90

5、判断返回值状态

[root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstab &> /dev/null

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstabhaha &> /dev/null #查看一个不存在的文件

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

6、条件测试

判断某需求是否满足,需要由测试机制来实现:

如何编写测试表达式以实现所需的测试

(1)执行命令,并利用命令状态返回值来判断

0:成功

1:失败

(2)测试表达式

test EXPRESSION

[ EXPRESSION ]  单中括号多见于数值比较

[[ EXPRESSION ]]   双中括号多见于字符串比较

注意:EXPRESSION两段必须有空白字符,否则为语法错误

bash的测试类型

数值测试:

-eq:是否等于

-ne:是否不等于

-gt:是否大于

-ge:是否大于等于

-lt:是否小于

-le:是否小于等于

[root@:vg_adn_tidbCkhsTest /tmp]#[11 -eq 21]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#[11 -eq 11]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

字符串测试

==:是否等于

>:是否大于

!=:是否不等于

=~:左侧字符串能否被右侧的PATTERN所匹配。右侧的PATTERN不能使用bash的通配符来进行。并且PATTERN是匹配左侧字符串的某一部分而已

-z "STRING":判断指定的字串是否为空,空则为真,不空则为假

-n "STRING":判断指定的字符串是否不空,不空则真,空则为假。

[root@:vg_adn_tidbCkhsTest /tmp]#[tom == tom]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#[tom != tom]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#["tom" != "join"]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

并不是说字符串比较这样子就完美了,如下所示:

[root@:vg_adn_tidbCkhsTest /tmp]#["a" > "b"]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#["a" < "b"]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" > "b"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" < "b"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

所以说字符串的比较有两点要注意:

1、字符串要加引用

2、要使用双中括号[[ EXPRESSION ]]来进行比较

[root@:vg_adn_tidbCkhsTest /tmp]#name=tom[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o.*"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o*"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "om"]][root@:vg_adn_tidbCkhsTest /tmp]#echo $?0[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o?" ]]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?

1

7、文件测试

文件存在性测试:

-e:FILE    文件的存在性测试,存在则为真,不存在则为假

文件类型测试:

-b FILE:文件是否为块设备文件

-c FILE: 文件是否为字符设备文件

-d FILE:文件是否是目录文件

-f FILE:文件是否是普通文件

-l FILE:文件是否为链接文件

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

-p FILE:文件是否为管道文件

[root@:vg_adn_tidbCkhsTest /tmp]#[-b /dev/xvda1]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#[-f /etc/init.d/functions]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

文件权限性测试

-r  FILE:文件是否可读

-w FILE:文件是否可写

-x FILE:文件是否可执行

[root@:vg_adn_tidbCkhsTest /tmp]#[-x /usr/bin/passwd]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

文件特殊权限测试

-g FILE:文件是否拥有SGID权限

-u FILE:文件是否拥有SUID权限

-k FILE:文件是否拥有sticky权限

[root@:vg_adn_tidbCkhsTest /tmp]#[-u /usr/bin/passwd]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

文件大小测试

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

[root@:vg_adn_tidbCkhsTest /tmp]#touch ./haha.sh[root@:vg_adn_tidbCkhsTest /tmp]#[-s haha.sh]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

[root@:vg_adn_tidbCkhsTest /tmp]#echo "hahahaha" >haha.sh[root@:vg_adn_tidbCkhsTest /tmp]#[-s haha.sh]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

从属关系测试

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

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

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?0

[root@:vg_adn_tidbCkhsTest /tmp]#[-O /home/tidb]

[root@:vg_adn_tidbCkhsTest /tmp]#echo $?1

组合条件运算

[ condition1 -a condition2 ]    相当于  condition1  &&  condition2

[ condition1 -o condition2 ]    相当于  condition1  ||  condition2

[ -not condition ]  相当于  !condition

练习题:判断主机名是否为空或主机名是“localhost.localdomain”

#!/bin/bash

hostName=$(hostname)[-z "$hostName"] || [[ $hostName == "localhost.localdomain"]] #这一句相当于: [ -n "$hostName" -o $hostName == "localhost.localdomain" ]if [$? -eq 0];thenhostname www.feng.com

fi

脚本的状态返回值

默认是脚本中执行的最后一条命令的状态返回值

自定义状态退出状态码:

exit [n]:n为自己指定的状态码。

注意L:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束。

向脚本传递参数:

位置参数变量

Scripts.sh arg1  arg2

引用方式:

$1,$2,......${n}..

[root@:vg_adn_tidbCkhsTest /tmp]#cat test4.sh

#!/bin/bash

file1_lines=$(grep '^$' $1 | wc -l)

file2_lines=$(grep '^$' $2 | wc -l)

echo "the totle lines: $[${file1_lines} + ${file2_lines}]"[root@:vg_adn_tidbCkhsTest /tmp]#bash test4.sh /etc/init.d/functions /etc/issue

the totle lines:91

特殊变量:

$0:脚本文件路径本身

$#:保存传递给当前脚本的参数的个数。

$*与$@:保存传递给当前脚本的所有参数。

[root@:vg_adn_tidbCkhsTest /tmp]#cat test5.sh

#!/bin/bash

echo "the nameof scripts is $(basename $0)"

echo "the arg's sum is $#"

echo "some names are $*"

[root@:vg_adn_tidbCkhsTest /tmp]#./test5.sh 1.txt 2.txt

the name of scripts is test5.sh

the arg's sum is 2

some names are 1.txt 2.txt

练习题:编写一个脚本,用来添加一个用户,要求必须指定一个用户

[root@:vg_adn_tidbCkhsTest /tmp]#cat test6.sh

#!/bin/bashif [$# -lt 1];thenecho "At least oneuser";

exit 2fiif grep "^$1>" /etc/passwd &> /dev/null;thenecho "userhas been exits"elseuseradd $1echo $1 | passwd --stdin $1 &> /dev/null

echo "useradd finished"

fi[root@:vg_adn_tidbCkhsTest /tmp]#./test6.sh hbase

useradd finished[root@:vg_adn_tidbCkhsTest /tmp]#./test6.sh hbaseuserhas been exits[root@:vg_adn_tidbCkhsTest /tmp]#

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

[root@:vg_adn_tidbCkhsTest /tmp]#cat test7.sh

#!/bin/bashif [$# -lt 2];thenecho "At least two numbers"exit 2fiif [$1 -lt $2];thenecho "Themax num is $2"elseecho "Themax num is $1"

fi[root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 3At least two numbers[root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 3 5Themax num is 5

[root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 7 5Themax num is 7

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

[root@:vg_adn_tidbCkhsTest /tmp]#cat test8.sh

#!/bin/bashif [$# -lt 1];thenecho "At least oneuser"exit 2fiif ! grep "^$1>" /etc/passwd &> /dev/null ;thenecho "user notexits"elseuuid=`id -u $1`if [$uuid%2==0];thenecho "this uuidisa ji shu"elseecho "this uuidisa ou shu"

fi

fi[root@:vg_adn_tidbCkhsTest /tmp]#./test8.sh hbase

this uuidis a ji shu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值