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
浙公网安备 33010602011771号