欢迎各位兄弟 发布技术文章
这里的技术是共享的
练习:写一个脚本
判断当前系统上是否有用户的默认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 #
如果脚本没有明确定义退出状态码,最后执行的一条命令的退出码即为脚本的退出状态码
[root@ebs-22618 ~]# history
[root@ebs-22618 ~]# history | wc -l
[root@ebs-22618 ~]# wc -l ~/.bash_history
[root@ebs-22618 ~]# echo $HISTSIZE
1000
[root@ebs-22618 ~]# echo $HISTFILESIZE
1000
[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 ~]#
[root@ebs-22618 ~]# nano filetest.sh
[root@ebs-22618 ~]# chmod +x filetest.sh
[root@ebs-22618 ~]# bash -n filetest.sh
filetest.sh: line 8: syntax error: unexpected end of file
[root@ebs-22618 ~]# nano filetest.sh
[root@ebs-22618 ~]# ./filetest.sh
[root@ebs-22618 ~]# bash -x filetest.sh
[root@ebs-22618 ~]# nano filetest.sh
[root@ebs-22618 ~]# ./filetest.sh
[root@ebs-22618 ~]# nano filetest2.sh
[root@ebs-22618 ~]# chmod +x filetest2.sh
[root@ebs-22618 ~]# ./filetest2.sh
[root@ebs-22618 ~]# nano filetest2.sh
[root@ebs-22618 ~]# ./filetest2.sh
[root@ebs-22618 ~]# echo $?
[root@ebs-22618 ~]# nano filetest2.sh
(如果没有指出退出状态码 ,那么最后一条语句的状态码,就是脚本返回的状态码)
[root@ebs-22618 ~]# ./filetest2.sh
Directory.
[root@ebs-22618 ~]# echo $?
0 (如果没有指出退出状态码 ,那么最后一条语句的状态码,就是脚本返回的状态码)
[root@ebs-22618 ~]#
[root@ebs-22618 ~]# nano filetest2.sh
[root@ebs-22618 ~]# ./filetest2.sh
No such file
[root@ebs-22618 ~]# echo $?
0
[root@ebs-22618 ~]# bash -x filetest2.sh
[root@ebs-22618 ~]# cat /etc/inittab /etc/fstab /etc/issue
选项是修正命令的执行特性的 参数是命令的作用对象
[root@ebs-22618 ~]# nano filetest3.sh
[root@ebs-22618 ~]# chmod +x filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstabddd
[root@ebs-22618 ~]# ./filetest3.sh (忘了给参数了)
[root@ebs-22618 ~]# bash -x filetest3.sh
[root@ebs-22618 ~]# nano filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab
[root@ebs-22618 ~]# nano filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab /etc
[root@ebs-22618 ~]# nano filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh /etc/fstab /etc/inittab /etc
[root@ebs-22618 ~]# nano filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh
[root@ebs-22618 ~]# ./filetest3.sh /etc/aa
[root@ebs-22618 ~]# nano shift.sh
[root@ebs-22618 ~]# ./shift.sh 1 2 3
[root@ebs-22618 ~]# help shift
shift 2 表示一下子踢掉2个,第三个就变成了第一个
[root@ebs-22618 ~]# nano shift.sh
[root@ebs-22618 ~]# ./shift.sh 1 2 3 4 5
[root@ebs-22618 ~]# nano calc.sh
#!/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
[root@ebs-22618 ~]# ./calc.sh 3 6