欢迎各位兄弟 发布技术文章
这里的技术是共享的
提示:"引用"一个命令的执行结果,要使用命令引用,比如 RESAULTS=`wc -l /etc/passwd | cut -d' ' -f1`;
使用一个命令的执行状态结果,要直接执行此命令,一定不能引用: 比如: if id user1 一句中的id命令就一定不能加反引号;
如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如 USERID=`id -u user1`;
如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
id -u user1
RETVAL=$? (如果使用了 给状态 赋值的话,那么,就只能使用 if [ $RETVAL -eq 0 ] 不能使用 if $RETVAL )
此句绝对不可以写为 RETVAL=`id -u user1`
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash:
如果有,就显示有多少个这类用户,否则就显示没有这类用户:
grep "\<bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
if grep "\<bash$" /etc/passwd &> /dev/null; then
练习:写一个脚本
给定一个文件,比如 /etc/inittab (我测试的是 ~/aaa.txt 它有7行空白行)
判断这个文件中是否有空白行:
如果有,则显示其空白行数,否则,显示没有空白行.
#!/bin/bash
AAA=~/aaa.txt
if grep "^$" $AAA &> /dev/null; then
LINE=`grep "^$" $AAA |wc -l`
echo $LINE
fi
练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为"good guy":否则,就显示此用户为"bad guy"
#!/bin/bash 一定为脚本的第一行,#!/bin/bash 上面加个空白行都不行
#!/bin/bash
USERNAME=user1
USERID=`id -u $USERNAME` #千成不能叫UID,它是系统的环境变量在用 可以用 export env printenv 看看哪些环境变量在用,千万在命名上不要重复
GROUPID=`id -g $USERNAME` #千成不能叫GID,它是系统的环境变量在用
if [ $USERID -eq $GROUPID ]; then #在引用变量名的时候才需要加个美元符$
echo "Good guy."
else
echo "Bad guy"
fi
#!/bin/bash
USERNAME=root
USERID=`id -u $USERNAME`
GROUPID=`id -g $USERNAME`
if [ $USERID -eq $GROUPID ]; then
echo "good guy"
else
echo "bad guy"
fi
进一步要求: 不使用id命令获得其id号:
#!/bin/bash
USERNAME=root
USERID=`id -u $USERNAME`
GROUPID=`id -g $USERNAME`
if [ $USERID -eq $GROUPID ]; then
echo "good guy. $USERNAME id is $USERID"
else
echo "bad guy. $USERNAME id is $USERID"
fi
练习:写一个脚本
给定一个用户,获取其密码警告期限:
而后判断用户密码剩余使用期限是否已经小于警告期限:
提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限如果小于警告期限,则显示|"Warning";否则,就显示"OK"
#!/bin/bash
USERNAME=user17
RESULT=`grep "^$USERNAME\>" /etc/shadow | cut -d: -f3,5,6`
RESULT_MAKE_TIME_FROM_70=`echo $RESULT | cut -d: -f1`
let TODAY_TIME_FROM_70=`date +%s`/86400
let RESULT_USERD_TIME=TODAY_TIME_FROM_70-RESULT_MAKE_TIME_FROM_70
RESULT_EXPIRED_TIME=`echo $RESULT | cut -d: -f2`
RESULT_WARNING_TIME=`echo $RESULT | cut -d: -f3`
let RESULT_EXPIRED_USERD_DIFF_TIME=RESULT_EXPIRED_TIME-RESULT_USERD_TIME
if [ $RESULT_EXPIRED_USERD_DIFF_TIME -lt $RESULT_WARNING_TIME ]; then
echo "warning"
else
echo "ok"
fi
练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000,如果大于,则显示"some command will gone.".否则显示ok
#!/bin/bash
NUM=`history | tail -1 | cut -d' ' -f2`
echo $NUM #为什么在命令行执行有 多少条命令输出,但是放在bash里,这里确输出空
#if [ $NUM -gt 1000 ]; then
# echo "some command gone!"
#else
# echo "ok"
#fi
shell中如何进行算术运算 以1,2,3,种最为常见 计算
A=3
B=6
1,let 算术运算表达式 相加
let C=$A+$B
2, $[算术运算表达式]
C=$[$A+$B]
3, $((算术运算表达式))
C=$(($A+$B))
4,expr 算术运算表达式,表达式中各操作数及操作符之间要有空格,而且要使用命令引用
C=`expr $A + $B`
[root@skLinux rootCodeFiles]# expr 3 \* 5 要用 斜线和乘号 #相乘
否则 # expr 3 * 5 会报 expr 语法错误
shell 算术运算
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash:
如果有,就显示其中一个的用户,否则就显示没有这类用户:
[root@ebs-22618 ~]# nano bash.sh
[root@ebs-22618 ~]# chmod +x bash.sh
[root@ebs-22618 ~]# ./bash.sh
[root@ebs-22618 ~]# nano bash.sh
#!/bin/bash
if grep "\<bash$" /etc/passwd &> /dev/null; then
NUM=` grep "\<bash$" /etc/passwd | wc -l`
echo "users count id $NUM"
else
echo "No such user"
fi
[root@ebs-22618 ~]# nano bash.sh
[root@ebs-22618 ~]# ./bash.sh
[root@ebs-22618 ~]# cp bash.sh bash2.sh
[root@ebs-22618 ~]# nano bash2.sh
#!/bin/bash
if grep "\<bash$" /etc/passwd &> /dev/null; then
FIRST=` grep "\<bash$" /etc/passwd | head -1 | cut -d: -f1`
echo "first user id $FIRST"
else
echo "No such user"
fi
[root@ebs-22618 ~]# ./bash2.sh
[root@ebs-22618 ~]# bc
[root@ebs-22618 ~]# date +%s
[root@ebs-22618 ~]# history
[root@ebs-22618 ~]# echo $HISTSIZE 命令大小是1000个
shell 退出后 此前的命令是保存在文件里面的 下次登录时,文件中存在的历史命令会被读进来
它保存在内存中的时候 是不会考虑此前从文件中读进来的这些 拿以前文件中的1000个加现在
的可能有1000个,总共有可能2000个 假如此时退出shell重新登录的话,可能只有1000个
[root@ebs-22618 ~]# A=3 这里是字符3 不是数字3
[root@ebs-22618 ~]# B=6 这里是字符6 不是数字6
[root@ebs-22618 ~]# C=$A+$B
[root@ebs-22618 ~]# echo $C
[root@ebs-22618 ~]# let C=$A+$B let命令让其做算术运算
[root@ebs-22618 ~]# echo $C
[root@ebs-22618 ~]# help let
[root@ebs-22618 ~]# D=$[$A+$B]
[root@ebs-22618 ~]# echo $D
[root@ebs-22618 ~]# E=$(($A+$B))
[root@ebs-22618 ~]# echo $E
[root@ebs-22618 ~]# F=`expr $A + $B`
[root@ebs-22618 ~]# echo $F
[root@ebs-22618 ~]# date +%s