懒散的人

导航

shell学习笔记(3)

算术运算:

  • let 表达式
  • $((表达式))
  • $[表达式]

运算符:+(加)   -(减)    *(乘)     /(整除)      %(求余数)

# let A=1+2

# echo $A

# echo $((2*5))

# echo $[10%3] 

手工创建帐号思路:

(1)/etc/passwd (7列)

  echo "$ACCOUNT:x:$[$MAXUID+1]:$[$MAXGID+1]::/home/$ACCOUNT:/bin/bash" >> /etc/passwd

(2)/etc/shadow(8列)

  chmod  u+w  /etc/shadow

  echo  "$ACCOUNT::::::::" >> /etc/shadow

  chmod  u-w  /etc/shadow

 (3)/etc/group

  echo "$ACCOUNT:x:$[$MAXGID+1]:$ACCOUNT" >> /etc/group

(4)家目录

  mkdir  /home/$ACCOUNT

  cp -a /etc/skel/.  /home/$ACCOUNT

  chown -R $ACCOUNT:$ACCOUNT  /home/$ACCOUNT

  chmod  700  /home/$ACCOUNT

(5)邮箱

  touch /var/spool/mail/$ACCOUNT

  chown  $ACCOUNT:mail  /var/spool/mail/$ACCOUNT

  chmod  660  /var/spool/mail/$ACCOUNT

(6)口令

  echo  "123"  | passwd --stdin  $ACCOUNT

如何获取系统当前最大的uid和gid?

# cut -f3 -d: /etc/passwd(-f3表示第3列,-d:表示分隔符为冒号)

# cut -f3 -d: /etc/passwd | sort -n(按照数字方式排序,升序)

# cut -f3 -d: /etc/passwd | sort -n | tail -n 1(得到排序后的最后一个数,即当前最大的uid)

# vim useradd.sh

 1 #!/bin/bash
 2 read -p "please input a username: " ACCOUNT
 3 grep -q "^$ACCOUNT\>" /etc/passwd && echo "the user $ACCOUNT is exist." && exit
 4 MAXUID=`cut -f3 -d: /etc/passwd | sort -n | tail -n 1`
 5 MAXGID=`cut -f4 -d: /etc/passwd | sort -n | tail -n 1`
 6 #1.change /etc/passwd
 7 echo "$ACCOUNT:x:$[$MAXUID+1]:$[$MAXGID+1]::/home/$ACCOUNT:/bin/bash" >> /etc/passwd
 8 #2.change /etc/shadow
 9 chmod u+w /etc/shadow
10 echo "$ACCOUNT::::::::" >> /etc/shadow
11 chmod u-w /etc/shadow
12 #3.change /etc/group
13 echo "$ACCOUNT:x:$[$MAXGID+1]:$ACCOUNT" >> /etc/group
14 #4.create home dir
15 mkdir /home/$ACCOUNT
16 cp -a /etc/skel/. /home/$ACCOUNT
17 chown -R $ACCOUNT:$ACCOUNT /home/$ACCOUNT
18 chmod 700 /home/$ACCOUNT
19 #5.create user mailboxid 
20 touch /var/spool/mail/$ACCOUNT
21 chown $ACCOUNT:mail /var/spool/mail/$ACCOUNT
22 chmod 660 /var/spool/mail/$ACCOUNT
23 #6.change user password
24 echo "123" | passwd --stdin $ACCOUNT &>/dev/null

 验证:用新创建的帐号u3登录

# id u3

# bash -x useradd.sh(-x表示打开调试开关)


 1. for循环

①for  变量  in  {  };do

   循环体

 done 

②for  变量  in  {变量值};do

   循环体

 done

③for  变量  in  ${seq  $变量1   $变量2};do

   循环体

 done  

④for  变量  in  变量值;do

   循环体

 done

 例1:批量创建帐号

# ABC=user10

# echo ${ABC##*[[:alpha:]]}(从左边开始截,截取到最后一个字母,然后把左边的丢掉,得到10) 

# echo ${ABC%%[0-9]*}(从右边开始截,截取到最后一个数字,然后把右边的丢掉,得到user)

 1 #!/bin/bash
 2 read -p "please input first user: " FIRSTUSER
 3 read -p "please input last user: " LASTUSER
 4 NAME=${FIRSTUSER%%[0-9]*}
 5 FIRST=${FIRSTUSER##*[[:alpha:]]}
 6 LAST=${LASTUSER##*[[:alpha:]]}
 7 for i in $(seq $FIRST $LAST);do
 8         grep "^$NAME$i\>" /etc/passwd && echo "$NAME$i is exist." && continue
 9         useradd $NAME$i && echo "123" | passwd --stdin $NAME$i &>/dev/null
10 done

 例2:1-100求和

1 #!/bin/bash
2 let sum=0
3 for i in $(seq 1 100);do
4         let sum=$sum+$i
5 done
6 echo "1+2+...+100=$sum"

 例3:1-100偶数求和

1 #!/bin/bash
2 let sum=0
3 for i in $(seq 1 100);do
4         if [ $[$i%2] -eq 0 ];then
5                 let sum=$sum+$i
6         fi
7 done
8 echo $sum

 例4:扫描当前网段有哪些主机在线

#!/bin/bash
for i in $(seq 1 254);do
        IP="192.168.80.$i"
        ping -c 1 -W 1 $IP &>/dev/null && echo "the host $IP is online." || echo "the host $IP is down."
done

# ifconfig eth0:0 192.168.80.2

# ifconfig eth0:1 192.168.80.10

# ifconfig eth0:2 192.168.80.20

# bash ping.sh

ctrl+z  暂停

# ps aux | grep ping

root 24533 0.0 0.1 106088 1388 pts/1 T 16:14 0:00 bash ping.sh
# kill -9 24533

# jobs

[1]+  Killed                  bash ping.sh

for循环的变量不仅仅可以是数字

 1 #!/bin/bash
 2 read -p "please input one dir: " dir
 3 for i in `ls $dir`;do
 4         if [ -L $dir/$i ];then
 5                 echo "$dir/$i is link"
 6         elif [ -f $dir/$i ];then
 7                 echo "$dir/$i is file"
 8         elif [ -d $dir/$i ];then
 9                 echo "$dir/$i is dir"
10         fi
11 done

 2. while循环

①while  [  判断式  ];do

   循环体

 done 

②while  read  变量;do(每次从文件中读取一行送给变量)

   循环体

 done <文件

③until  [  判断式  ];do(判断式不成立时执行循环,直到条件成立就退出循环)

   循环体

 done

用while循环累加求和:

1 #!/bin/bash
2 let sum=0
3 let i=1
4 while [ $i -le 100 ];do
5         let sum=$sum+$i
6         let i=$i+1
7 done
8 echo "1+2+...+100=$sum"

 用until循环累加求和:

1 #!/bin/bash
2 let sum=0
3 let i=1
4 until [ $i -gt 100 ];do
5         let sum=$sum+$i
6         let i=$i+1
7 done
8 echo "1+2+...+100=$sum"

读取/etc/passwd文件,然后给每一行添加行号输出。 

1 #!/bin/bash
2 let num=1
3 while read line;do
4         echo -e "$num\t$line"
5         let num=$num+1
6 done < /etc/passwd

 显示系统所有的普通帐号,并添加行号输出。

 1 #!/bin/bash
 2 let num=1
 3 while read line;do
 4         useruid=`echo $line | cut -f3 -d:`
 5         name=`echo $line | cut -f1 -d:`
 6         usershell=`echo $line | cut -f7 -d:`
 7         if [ $useruid -ge 500 -a $useruid -lt 65534 ];then
 8                 echo -e "$num\t$name\t$usershell"
 9                 let num=$num+1
10         fi
11 done < /etc/passwd

  

posted on 2019-09-13 17:30  懒散的人  阅读(270)  评论(0)    收藏  举报