字符串测试:
== : 测试是否相等, 相等为真, 不等为假
!= : 测试是否不等, 不等为真, 等为假
>
<
-n string : 测试指定字符串是否为空, 空则真,不空则假
-z string : 测试指定字符串是否不空,不空为真, 空则为假
练习:传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来。
#!/bin/bash
#
if [ $# -eq 0 ]; then
echo 'usage: need a variable.'
exit 8
fi
USERID=`id -u $1`
GROUPID=`id -g $1`
if [ $USERID -eq $GROUPID ]; then
USERNAME=`id -u -n $1`
GROUPNAME=`id -g -n $1`
echo "username is$USERNAME"
echo "groupname is$GROUPNAME"
fi
或者:
#!/bin/bash
#
if [ $# -eq 0 ]; then
echo 'usage : need a variable.'
exit 8
fi
if ! id $1 &> /dev/null; then
echo "No usch user."
exit 10
fi
if [ `id -n -u $1` == `id -n -g $1` ]; then
echo 'username == groupname'
else
echo 'username != groupname'
fi
循环 : 进入条件,退出条件
for
while
until
for 变量 in 列表; do
循环体
done
{1..100}
seq [起始数][步进数][结束数]
起始数和步进数可以省略
练习:写一个脚本传递一个参数(单字符就行)给脚本,如参数为q,就退出脚本;否则,就显示用户的参数;
#!/bin/bash
#
if [ $1 = 'q' ]; then
exit 0
else
echo $1
fi
练习:写一个脚本传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数;
#!/bin/bash
#
if [ $1 = 'q' ]; then
exit 1
elif [ $1 = 'Q' ]; then
exit 2
elif [ $1 = 'quit' ]; then
exit 3
elif [ $1 = 'Quit' ]; then
exit 4
else
echo $1
fi
练习:传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如:./calc.sh 5 / 2
#!/bin/bash
#
echo "scale=2;$[$1$2$3]" | bc
练习:传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。
#!/bin/bash
#
if [ $# -ne 3 ]; then
echo "Please input three
numbers."
exit 10
elif [ $1 -ge $2 ]; then
MAX=$1
MIN=$2
else
MAX=$2
MIN=$1
fi
if [ $3 -gt $MAX ]; then
MAX=$3
elif [ $3 -lt $MIN ]; then
MIN=$3
fi
echo "The MAX is $MAX,the MIN is $MIN."
写一个脚本:
1
、设定变量FILE的值为/etc/passwd
2
、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:
Hello, root, your shell: /bin/bash
3
、统计一共有多少个用户
for I in `seq 1 $LINES`; do echo "Hello, `head -n $I /etc/passwd |tail -1 | cut -d: -f1`"; done
只向默认shell为bash的用户问声好
#!/bin/bash
#
FILE=/etc/passwd
LINES=`wc -l /etc/passwd | cut -d' ' -f1`
for I in `seq 1 $LINES`; do
echo "hello,`head -n $I
/etc/passwd | tail -1 | cut -d: -f1`,you shell:`head -n $I /etc/passwd | tail
-1 | cut -d: -f7`";
done
echo "The users number is $LINES."
07_01_vim编辑器详解
vim编辑器:文本编辑器,字处理器,处理ASCII
其他编辑器:nano, sed
vi: Visual Interface
vim: VI iMproved
vi特点:全屏编辑器,模式化编辑器
vim模式:
编辑模式(命令模式)
输入模式
末行模式
模式转换:
编辑-->输入:
i: 在当前光标所在字符的前面,转为输入模式;
a: 在当前光标所在字符的后面,转为输入模式;
o: 在当前光标所在行的下方,新建一行,并转为输入模式;
I:在当前光标所在行的行首,转换为输入模式
A:在当前光标所在行的行尾,转换为输入模式
O:在当前光标所在行的上方,新建一行,并转为输入模式;
输入-->编辑: ESC
编辑-->末行:”:“
末行-->编辑: ESC, ESC
一、打开文件
# vim /path/to/somefile
vim +# :打开文件,并定位于第#行
vim +:打开文件,定位至最后一行
vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首
打开文件后默认处于编辑模式
二、关闭文件
1、末行模式关闭文件
:q 退出
:wq 保存并退出
:q! 不保存并退出
:w 保存
:w! 强行保存
:wq --> :x
:x 如果文件没有修改,直接退出;如果有修改,则保存后退出
2、编辑模式下退出
ZZ: 保存并退出
三、移动光标(编辑模式)
1、逐字符移动:
h: 左
l: 右
j: 下
k: 上
#h: 移动#个字符;
2、以单词为单位移动
w: 移至下一个单词的词首
e: 跳至当前或下一个单词的词尾
b: 跳至当前或前一个单词的词首
#w:
3、行内跳转:
0: 绝对行首
^: 行首的第一个非空白字符
$: 绝对行尾
4、行间跳转
#G = #gg:跳转至第#行;
G:最后一行
gg:第一行
末行模式下,直接给出行号即可
四、翻屏
Ctrl+f: 向下翻一屏
Ctrl+b: 向上翻一屏
Ctrl+d: 向下翻半屏
Ctrl+u: 向上翻半屏
五、删除单个字符
x: 删除光标所在处的单个字符
#x: 删除光标所在处及向后的共#个字符
六、删除命令: d
d命令跟跳转命令组合使用;
#dw, #de, #db,#d$,#d0,#d^
#df@, #dt@
dd: 删除当前光标所在行
#dd: 删除包括当前光标所在行在内的#行;
末行模式下:
StartADD,EndADDd
.: 表示当前行
$: 最后一行
+#: 向下的#行
e.g: 1,8d; 1,.d; 1,$d; 3,+23d; .,+3d, -3, $d, .,$-2d
七、粘贴命令 p
p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面;
P: 如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面;
八、复制命令 y
用法同d命令
九、修改:先删除内容,再转换为输入模式
c: 用法同d命令
十、替换:r
R: 替换模式
十一、撤消编辑操作 u
u:撤消前一次的编辑操作
连续u命令可撤消此前的n次编辑操作,vi只保存了此前的50次操作
#u: 直接撤消最近#次编辑操作
撤消最近一次撤消操作:Ctrl+r
十二、重复前一次编辑操作
.
十三、可视化模式
v: 按字符选取
V:按行选取
ctrl+v:按矩形选取
十四、查找
/PATTERN:向下查找
?PATTERN:向上查找
n:下一个查找结果
N:上一个查找结果
十五、查找并替换
在末行模式下使用s命令,格式同sed一样
ADDR1,ADDR2 s@PATTERN@string@gi
1,$:全文范围
%:表示全文,等于 1,$
g:全局替换
i:忽略大小写