练习:写一脚本,实现如下功能:

1、让用户通过键盘输入一个用户名

2、如果用户存在,就显示其用户名和UID;

3、否则,就显示用户不存在;


#!/bin/bash

read -t 10 -p "Enter a username: " userName       -t是等待时间

# userName=${userName:-root}                      不输入则使用默认值

if id $userName &> /dev/null; then

userID=`id -u $userName`

echo "$userName: $userID"

else

echo "$userName not exist."

fi



练习:写一脚本,实现如下功能:

1、让用户通过键盘输入一个用户名,如果用户不存在就退出;

2、如果用户的UID大于等于500,就说明它是普通用户;

3、否则,就说明这是管理员或系统用户;


#!/bin/bash


# exit 6 -- 

read -t 10 -p "Enter a username: " userName

if ! id $userName &> /dev/null; then         if查看的是成功与否,若成功则进入,这里取反,因此失败则进入

echo "$userName not exist."

exit 6

fi                                            一个if.else.段最后一定加fi


userID=`id -u $userName`


if [ $userID -ge 500 ]; then                因为有-ge,整数测试,因此自动转为整数比较

echo "A common user."

else

echo "Admin or System user."

fi



bash的知识点:

组合条件测试:对条件做逻辑运算

与:条件1 && 条件2

[root@zhenzhen ~]# ls && ls 类似这种,可以组合指令两条指令

条件1为假,则最终结果一定为假,因此,条件2将不执行;

条件1为真,则最终结果决于后面条件,因此,条件2必须执行; 

或:条件1 || 条件2

条件1为真,则最终结果一定为真,因此,条件2将不再执行;

条件1为假,则最终结果决于后面条件,因此,条件2必须执行; 

非: ! 条件


[root@zhenzhen ~]# username=root

[root@zhenzhen ~]# id $username &> /dev/null && echo "$username exists" || echo "$username not exist"

root exists

[root@zhenzhen ~]# username=root123

[root@zhenzhen ~]# id $username &> /dev/null && echo "$username exists" || echo "$username not exist"

root123 not exist

这个例子也就是说明:第一个执行成功,则执行第二个,若第一个失败,则执行第三个,按顺序执行,然后根据逻辑判断继续否

与的优先级大于或


练习:写一脚本,实现如下功能:

1、让用户通过键盘输入一个用户名,如果用户不存在就退出;

2、如果其UID等于其GID,就说它是个"good guy"

3、否则,就说它是个“bad guy”;


#!/bin/bash

# exit 6 -- 

read -t 10 -p "Enter a username: " userName

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

echo "$userName not exist."

exit 6

fi


if [ `id -u $userName` -eq `id -g $userName` ]; then

echo "Good guy."

else

echo "Bad guy."

fi


扩展:判断当前系统上的所有用户是Good guy还是Bad guy.


for userName in `cut -d: -f1 /etc/passwd`; do

done



练习:写一个脚本,实现如下功能:

1、添加10个用户stu1-stu10;但要先判断用户是否存在;

2、如果存在,就用红色显示其已经存在

3、否则,就添加此用户;并绿色显示;

4、最后显示一共添加了几个用户;


#!/bin/bash

#

declare -i userCount=0

for i in {1..10}; do

if id stu$i &> /dev/null; then

echo -e "\033[31mstu$i\033[0m exists."

else

useradd stu$i && echo -e "add \033[32mstu$i\033[0m finished."

这样的好处是在添加成功后就会显示添加成功

因为是与连接的两个操作,如果第一个失败,则后面不会执行

let userCount++

fi

done


echo "Add $userCount users."





练习:求200以内所有3的整数倍的正整数的和;

#!/bin/bash

declare -i sum=0

for i in {1..200}; do

if [ $[$i%3] -eq 0 ]; then

let sum+=$i

fi

done


echo "The sum is: $sum."


另一种实现方式

#!/bin/bash


declare -i sum=0


for i in {1..10};do

 [ $[${i}%3] -eq 0 ] && sum=$[$sum+$i]

done

echo $sum




 

在剩下的三月里,你愿意与学习结为伴侣,无论贫穷还是富贵,无论电脑还是手机,无论多困或者多累,无论想吃还是想睡,都要把学习放在第一位,以不落后为目标,同甘共苦同舟共济永不言弃,爱惜她尊重她理解她保护她,你愿意这样做么?

Yes, I do.



bash编程之:字符测试

双目:

>: 大于

<: 小于

==: 等于,等值比较

=~:左侧是字符串,右侧是一个模式,判定左侧的字符串能否被右侧的模式所匹配;通常只在[[]]中使用;

模式中可以使用行首、行尾锚定符;但模式不要加引号;


例子:也是要用[]  中间比较符使用上面几个,则就是两侧为字符串进行比较

[root@zhenzhen ~]# stringA=123

[root@zhenzhen ~]# stringB=1234

[root@zhenzhen ~]# [ "$stringA" == "$stringB" ]

[root@zhenzhen ~]# echo $?

1

[root@zhenzhen ~]# stringB=123

[root@zhenzhen ~]# [ "$stringA" == "$stringB" ]

[root@zhenzhen ~]# echo $?

0

例子:模式匹配的,使用两个方括号

[root@zhenzhen ~]# username=root

[root@zhenzhen ~]# [[ "$username" =~ 'ot' ]]

[root@zhenzhen ~]# echo $?

0

单目:

-n $stringVar: 字符串是否不空,不空为真,空则为假;

-z $stringVar: 字符串是否为空,空则为真,不空则假;

[root@zhenzhen ~]# [ -n "$stringA" ]

[root@zhenzhen ~]# echo $?

0



判定所有用户是否拥有可登录shell

#!/bin/bash

for userName in `cut -d: -f1 /etc/passwd`; do

if [[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]; then

echo "login user: $userName"

else

echo "nologin user: $userName"

fi

done





练习:写一个脚本

1、让用户交互式输入一个用户名,先判定用户是否存在;不存在,则以7为退出码;

    2、判断用户的shell是否为/bin/bash;如果是,则显示为“Bash User.”,退出码为0; 否则,则显示为“Not Bash User.”,退出码为1;


#!/bin/bash

read -p "input an username: " username

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

 echo "user: $username is not existing"

 exit 7

else

 if [[ `grep '^${username}\>' /etc/passwd | cut -d: -f7` =~ sh$ ]] ; then

     echo "Bash user"

 else

     echo "not bash user"

     exit 1

 fi

fi


练习:写一个脚本

1、显示如下菜单:

cpu) show cpu info;

mem) show memory info;

quit) quit

Enter your option: 

2、如果用户选择cpu,则显示文件/proc/cpuinfo的信息;

3、如果用户选择mem,则显示文件/proc/meminfo的信息;

4、如果用户选择quit,则退出,且退出码为5;

5、如果用户键入其它字符,则显示未知选项,请重新执行脚本;退出码为6;

   

    #!/bin/bash

echo -e "cpu) show cpu info\nmem) show memory info\nquit) quit"

read -p "Enter your option:" name

if [ "$name" == "cpu" ];then

  ls -l /proc/${name}info

elif [ "$name" == "mem" ];then

  ls -l /proc/${name}info

elif [ "$name" == "quit" ];then

  exit 5

else

  echo "stupid"

  exit 6

fi



正则表达式,grep, egrep;diff, patch


grep, egrep


grep [options] 'pattern' file...


基本:

字符匹配:., [], [^]

次数匹配:*, \?, \{m\}, \{m,n\}

.*

位置锚定:\<, \b, \>, ^, $

分组:\(\)

前向引用:\1, \2


扩展:

字符匹配:., [], [^]

次数匹配:*, ?, {m}, {m,n}, +

位置锚定:\<, \b, \>, ^, $

分组:()

前向引用:\1, \2

或:a|b


条件判断

if CONDITION; then

statement1

...

fi


if CONDITION; then

分支1;

else

分支2;

fi


if CONDITION1; then

分支1

elif CONDITION2; then

分支2

...

else

分支n

fi


条件测试:

bash: 每个命令,执行状态返回值:

成功:0

失败:非0

$?: 


脚本的状态返回值:脚本执行的最后一条命令;

自定义脚本状态返回值:exit [n]


引用命令的执行结果:使用`COMMAND`或$(COMMAND)

引用命令执行成功与否的状态结果:一定是直接执行命令,此时,通常需要将执行结果重定向至/dev/null,在if后使用;


if id $userName &> /dev/null


if [ `id -u $userName` -eq 0 ]  


条件测试:

test 测试表达式

[ 测试表达式 ]    

[[  ]]


整数测试:使用下面这些就使得两边都是整数了

-eq, -ne, -le, -gt, -lt, -ge

        [   -   ]  比较两个整数的





vi编辑器


Linux: 使用文本文件来保存配置文件


文本编辑器:ASCII文件

emacs, vi


vi: Visual Interface


全屏文本编辑器, nano

模式化的编辑器


moduler


vim: vi improved

vi的模式:

编辑模式:键盘操作通常被解析为编辑命令;

输入模式:输入模式;

末行模式:vim的内置的命令行接口,执行vim内置命令


编辑模式-->输入模式

i: 在当前光标所在处输入;

I: 在当前光标所在行的行首输入;


a: 在当前光标所在处后面输入;

A:在当前光标所在行的行尾输入;


o: 在光标所在行的下方新增一个空白行输入;

O:              上方


输入模式-->编辑模式:

ESC


编辑模式-->末行模式:

:

末行模式-->编辑模式:

ESC, ESC




vim命令的使用格式:

vim [options] /path/to/file...


退出

:q!, 不保存并退出

:wq, 保存并退出

:x, 保存并退出

编辑模式:ZZ, 保存退出

打开:vim可以一次打开多个文件

多文件跳转:

:next

:prev

:first

:last


分割窗口打开多个文件:

-o: 水平分割

Ctrl+w然后松开,左右箭头键

-O:垂直分割

Ctrl+w然后松开, 上下箭头键


+[#]: 打开文件后直接让光标处于第#行的行首;


光标移动:

单字符移到:

h: 左

l: 右

j: 下

k: 上


单词间移动:

w: 下个单词的词首;

b: 当前或前一个词的词首

e: 当前或下一个词的词尾


行内移动:

0: 绝对行首

^: 第一个非空白字符

$: 绝对行尾


句子间移动:

)

(


段落间移动:

}

{


行间移动:

#G

G:最后一行

1G: 第一行


编辑操作:

x: 删除光标所在处的字符

#x: 删除光标所在处开始向后的#个字符;


r: 替换光标所在处的字符


d: 删除命令

结合各光标跳转命令使用

dd: 删除一行

#dd: 


末行模式:范围定界

start,end: 

10,19

10,+9

.:表示当前行

$:最后一行

.,$-2

.,$d  删除当前行至最后一行

/pat1/,/pat2/: 起始处为光标所在行,

:% 



c: 改变

cc:

#cc:


y: yank, 复制

yy

#yy


p: paste, 粘贴

复制或删除的是整行

p: 粘贴在光标所在行的下方

P:                   上方


复制或删除的为非整行

p: 粘贴在光标所在字符的后面

P:                    前面


撤消编辑:

u: undo

#u: 


撤消此前的撤消:

Ctrl+r


重复执行此前的命令:

.



翻屏:

Ctrl+f: 向文件尾部翻一屏

Ctrl+b:       首

Ctrl+d:       尾    半

Ctrl+u:       首    半

Enter:

k:


查找:

/keyword

?keyword

n:

N: