shell编程

1.查看当shell中变量:本地和环境变量的命令:set

  查看当前shell中的环境变量:printenv/env/export

2.变量存入到内存中是字符串

3.#!/bin/bash <--表示需要Linux调用Linux内核解释器才能执行

4.显示所有以数字结尾且文件名中不包含空白的文件:ls *[^[:space:]]*[0-9]

5.重定向:>覆盖重定向      >> 追加重定向       2> 错误覆盖重定向  2>>错误追加重定向  &> 全部重定向

6.管道:管道线前面的命令结果作为后面命令的参数

shell编程实例

mkdir shell

cd shell

查看时sh test1

1.添加一个用户user1,每个用户的密码和用户名相同,并且添加密码完成后不显示passwd执行  结果,并显示添加成功信息。

vi ./test1

#!/bin/bash

#

#

useradd user1

echo "user1" | passwd --stdin user1 &>/dev/null

echo 'add user user1 success'

若添加其它几个用户,可以使用变量

#!/bin/bash

#

#

useradd $1

echo "$1" | passwd --stdin $1&>/dev/null

echo 'add user $1 success'

2.使用一个变量保存一个变量名,删除此变量中的用户,并一并删除其家目录,显示“用户删除成功”

#!/bin/bash

userdel -r $1  --> -r表示目录邮件一并删除
echo "Delete user $1 success."

3.如果用户存在,就显示用户已存在;否则,就添加此用户;
id user1 && echo "user1 exists." || useradd user1

如果用户不存在,就添加;否则,显示其已经存在;
! id user1 && useradd user1 || echo "user1 exists."

如果用户不存在,添加并且给密码;否则,显示其已经存在;
! id user1 && useradd user1 && echo "user1" || passwd --stdin user1  || echo "user1 exists."

4.如果/etc/inittab文件的行数大于50,就显示好大的文件

#!/bin/bash

LINE_NUM=”wc –l /etc/inittab | cut –d’ ’   -f1”

[$LINE_NUM –gt 50 ] && echo “big file.”  || echo “small”

5.添加3个用户,并且设置密码和用户名相同,如果用户已经存在,显示:已存在添加完成之后计算系统一共有多个用户

#!/bin/bash
if ! id $1 && useradd $1 && echo "$1" | passwd --stdin $1 &>/dev/null;then
 echo "add success"
else
 echo "$1 exists"
fi
COUNT=`wc -l /etc/passwd | cut -d ' ' -f1`
echo "$COUNT users"
6.如果其UID=0,就显示其为管理员,否则显示其为普通用户

 #!/bin/bash
NAME=root
USERID=`id -u $NAME`
if [ $USERID -eq 0 ]; then
  echo "Admin"
else
  echo "common user."
fi

7.判断命令历史中历史命令的总条目大于500,如果大于,则显示“Some command is done.”,否则显示:“OK”

8.给定一个用户,获取其密码警告期限,然后判断用户密码使用期限是否已经小于警告期限,如果小于,则是显示“WARN” ,否则显示密码还有多少天到期。

#!/bin/bash
C_DAY=`grep ^$1 /etc/shadow | awk -F: '{print $3}'`
M_DAY=`grep ^$1 /etc/shadow | awk -F: '{print $5}'`
W_DAY=`grep ^$1 /etc/shadow | awk -F: '{print $6}'`
N_DAY=$[`date +%s`/86400]
U_DAY=$[$N_DAY-$C_DAY]
L_DAY=$[$M_DAY-$U_DAY]
if [ $L_DAY -le $W_DAY ];then
   echo "Warn."
else
  echo "left day is $L_DAY"
fi

ps:date  +%s      :今天的秒数

9.只向默认shell为bash的用户问好(判断当前系统上是否有用户的默认shell为bash)

#!/bin/bash
L_NUM=`wc -l /etc/passwd | cut -d' ' -f1`

for I in `seq $L_NUM`
do
  LINE=`head -$I /etc/passwd | tail -1`
  SHELL_U=`echo "$LINE" | cut -d: -f7`
  U_NAME=`echo "$LINE" | cut -d: -f1`
  if [ $SHELL_U == '/bin/bash' ];then
     echo "hello $U_NAME"
  fi
done  

也可以:

grep "bash$" /etc/passwd &> /dev/null

    RETVAL=$?

    if [ $RETVAL -eq 0 ]; then

  echo "hello"

    fi

10.指定一个用户名,判断此用户的用户名和它的基本组 组名是否相同

#!/bin/bash

if  ! id $1 &>/dev/null ; then

   echo “No such user.”

   exit 12

fi

if [  $1 == `id –n –g $1` ] ;then

  echo “same”

else

  echo “different”

fi

11.传给脚本一个参数:目录,输出该目录中文件最大的,文件名和文件大小:

#!/bin/bash
#
if [ -d $1 ];then
   L_NUM=`du -a $1 | wc -l`
   for I in `seq $L_NUM`;do
      LINE=`du -a $1 | sort -nr | head -$I | tail -1`
      F_SIZE=`echo $LINE | awk '{print $1}'`
      F_NAME=`echo $LINE | awk '{print $2}'`
      if [ -f $F_NAME ];then
         echo "The max file is $F_NAME ,filesize $F_SIZE"
         break
      fi
    done
else
   echo "$1 is not a dir."
   exit 2
fi

12.查询当前192.168.1.x网段内,那些IP被使用了,输出这些IP到一个文件中

#!/bin/bash
#
N=1
for I in {2..254};do
  R=`ping -c1 192.168.1.$I | grep received | cut -d, -f2 | cut -d' ' -f2`
  if [ $R -eq 1 ];then
    echo  -e "$N   192.168.1.$I" >> /tmp/ips
    N=$[$N+1]
  fi  
done
原文地址:https://www.cnblogs.com/Mandylover/p/5074172.html