练习:写一脚本,实现如下功能:
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:
转载于:https://blog.51cto.com/wukong0716/1703034