一、vi编辑器的使用:
1、插入文本类命令
i 在光标前
I 在当前行首
a 光标后
A 在当前行尾
2、 删除命令
x 删除当前光标所在的字符
dd 删除当前整行
3、搜索命令
/abc 从光标开始处向文件尾搜索
?abc 从光标开始处向文件首搜索
n 在同一方向重复上一次搜索命令
N 在反方向重复上一次搜索命令
4、屏幕翻滚类命令
ctrl+f 向文件尾翻一屏
ctrl+b 向文件首翻一屏
5、显示行号
:set nu
取消
:set nonu
6、高亮显示设置
:syntax on
:syntax off
注:系统没有支持的话,可以通过.vimrc文件设置,只要在用户的根目录创建
该文件。
文件中可以直接这样在文件中编辑。
syntax on
7、区别:
1)单引号与双引号的区别:
单引号引起的内容原样输出;双引号引起的内容不会原样输出。
2)(){}[]区别:
()命令替换,与反引号有相同之处
{} shell中变量的原型
[]
3)一串的命令执行()和{}
()和{}都是对一串的命令进行执行,但有所区别:
A,()只是对一串命令重新开一个子shell进行执行
B,{}对一串命令在当前shell执行
C,()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
D,()最后一个命令可以不用分号
E,{}最后一个命令要用分号
F,{}的第一个命令和左括号之间必须要有一个空格
G,()里的各命令不必和括号有空格
H,()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则
影响到括号里的所有命令
我们来看几个例子:
$ var=test
$ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效
notest
$ echo $var ###父shell中值仍为test
test
$ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格
notest
$ echo $var ###父shell中的var变量的值变为了notest
notest
$ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重
定向到文件a中,
test2 ###而test2输出则仍输出到标准输出中。
$ cat a
test1
$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的
标准输出全部被重定向到文件a中
$ cat a
test1
test2
4)几种特殊的替换结构:
${var:-string},${var:+string},${var:=string},${var:?string}
${var:-string}
为空,则用string值来替换输出;
不为空,则用变量原来值输出。
若变量var为空,则用在命令行中用string来替换${var:-string},否则变量
var不为空时,则用变量var的值来替换${var:-string}
如:
$ echo newvar
$ echo ${newvar:-a}
a
$ echo newvar ###变量newvar的值仍然是空,但上一命令行中${newvar:-a}
被替换成了a
$ newvar=b
$ echo ${newvar:-a} ###变量newvar的值不为空时,此命令行中的
${newvar:-b}被替换为$newvar,即b
b
$
${var:=string}
为空,则用string值来替换输出并且将string值重新赋值给变量var;
不为空,则用变量var原来值输出,不替换。
${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给
它赋上一个默认值。
它的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若
var为空时,用string替换${var:=string}的同时,把string赋给变量var:
$ echo newvar
$ echo ${newvar:=a}
a
$ echo newvar ###变量newvar被赋值为a,同时${newvar:=a}被替换成a
a
$ echo ${newvar:=b} ###变量newvar不为空(其值已被赋为a),则
${newvar:=b}被替换为newvar的值(即b)
a
$ echo $newvar
a
${var:+string}
为空,则不替换,输入原来空值;
不为空,则用string值来替换输出,不赋值给变量var。
${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换
成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因
为变量var此时为空,所以这两种说法是等价的)
$ echo $newvar
a
$ echo ${newvar:+b}
b
$ echo $newvar
a
$ newvar=
$ echo ${newvar:+b}
$
${var:?string} 可以利用此特性来检查是否设置了变量的值。
为空,则把{}中的内容输出到标准错误中;
不为空,则变量var值输出。
$ newvar=
$ echo ${newvar:?没有设置newvar的值}
bash: newvar: 没有设置newvar的值
$ newvar=a
$ echo ${newvar:?没有设置newvar的值}
a
$
5)四种模式匹配替换结构:
${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
这四种结构的意义是:${var%pattern}和${var%%pattern}表示从最右边(即结
尾)匹配的,${var#pattern} 和${var##pattern}从最左边(即开头)匹配的。
其中${var%pattern}和${var#pattern}是最短匹配,${var%%pattern}和
${var##pattern}是最长匹配。只有在pattern中使用了通配符才能有最长最短
的匹配,否则没有最长最短匹配之分。
结构中的pattern支持通配符,*表示零个或多个任意字符,?表示零个或一个
任意字符,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面
的字符。
实例:
BMS01:~/cxw # cxw=1
BMS01:~/cxw # echo $cxw
1
BMS01:~/cxw # echo "$cxw"
1
BMS01:~/cxw # echo '$cxw'
$cxw
二、SH编程使用
1、给变量赋值有两种方式,直接使用“=”或使用键盘输入值
实例:
#!/bin/bash
echo "通过=方式赋值:"
name='jack'
echo $name
------------
echo "请出入你的名字:"
read name1
echo "-----------"
echo "读取出来,打印出来:"
echo $name1
echo "-----------"
echo "读取出来,加上一些字符后,打印出来:"
echo ${name1}abc
清除变量
使用unset命令清除变量
$ TMP_VAR=foo
$ echo ${TMP_VAR}
foo
$ unset TMP_VAR
$ echo ${TMP_VAR}
$
2、输入一些系统命令的值
可以使用echo `date`或者echo $(date)
实例:
echo "系统当前时间1:"
echo `date` ------这里是反引号,在键盘左上角。
echo "-----------"
echo "系统当前时间2:"
echo $(date)
3、子shell与父shell
子shell如何得到父shell设置的值,需要在父shell使用export来声明,相当
于全局变量。
实例:
BMS01:~/cxw # export a=15
BMS01:~/cxw # echo $a
15
BMS01:~/cxw # sh
BMS01:~/cxw # echo $a
15
4、关于数值运算
expr和echo的使用
expr 需要注意空格问题。
expr 1 + 2
echo $((1+2))
echo $((1*2))
实例:
BMS01:~/cxw # expr 1+2 ---不正确,必须要空格。
1+2
BMS01:~/cxw # expr 1 + 2
3
BMS01:~/cxw # expr 1*2 ---需要确认。
1*2
----------------------
BMS01:~/cxw # echo $((1+2))
3
BMS01:~/cxw # echo $((1 + 2))
3
BMS01:~/cxw # echo $((1 * 2))
2
-------------------------
变量a,运算后赋值返回给a
BMS01:~/cxw # a=10
BMS01:~/cxw # echo $a
10
BMS01:~/cxw # a=`expr $a + 20` ----这里是反引号。
BMS01:~/cxw # echo $a
30
5、条件测试和条件判断
if ... then ... else ... fi 的格式用法。then要换一行来写。
实例:
#!/bin/bash
echo "---条件测试和条件判断---"
echo "----------------"
echo "请输入用户名字:"
read name1
#if test "$name1" = "jack"
if [ "$name1" = "jack" ]
then
echo "用户登录成功"
else
echo "用户登录失败"
fi
-------------
注:#if test "$name1" = "jack" ----第一种方法
if [ "$name1" = "jack" ] ----第二种方法,中括号和等号之间必须
要有空格,不然程序会出错。
[] 中括号,严格需要留有空格。
6、逻辑运算符 AND/OR 的使用
逻辑运算符OR 可以缩写 -o ||
逻辑运算符AND 可以缩写 -a &&
实例1:
#!/bin/bash
echo "---条件测试和条件判断-逻辑运算OR用法---"
echo "逻辑运算符OR 可以缩写 -o"
echo "----------------"
echo "请输入用户名字:"
read name1
if [ "$name1" = "jack" -o "$name1" = "tom" ]
then
echo "用户登录成功"
else
echo "用户登录失败"
fi
---------
实例2:
#!/bin/bash
echo "---条件测试和条件判断-AND用法---"
echo "逻辑运算符AND 可以缩写 -a"
echo "----------------"
echo "请输入用户名字:"
read name1
echo "请输入密码:"
read password1
#if test "$name1" = "jack"
if [ "$name1" = "jack" -a "$password1" = "1234" ]
then
echo "用户登录成功"
else
echo "用户登录失败,请检查输入用户名和密码"
fi
7、数值,字符串,文件状态测试,((..))和[[..]]的使用
数值比较:
-eq 等于 Equal
-ne 不等于 not Equal
-lt 小于 Less than
-le 小于等于
-gt 大于 Greater Than
-ge 大于等于
实例1:
#!/bin/bash
echo "---数值,字符串,文件状态测试,((..))和[[..]]的使用---"
echo "----------"
echo "请输入一个分数:"
read num1
if [ "$num1" -ge 80 ]
then
echo "优秀"
elif [ "$num1" -lt 80 -a "$num1" -ge 60 ]
then
echo "及格"
else
echo "不及格"
fi
---------
实例2:
#!/bin/bash
echo "---数值,字符串,文件状态测试,((..))和[[..]]的使用2---"
echo "---------"
echo "请输入一个分数:"
read num2
if (( $num2 >= 80 )) #----数学符号
then
echo "优秀"
#elif [[ $num2 -ge 60 && $num2 -lt 80 ]] #----字符标示的
elif (($num2 >= 60 && $num2 <80 ))
then
echo "及格"
else
echo "不及格"
fi
--------------------
注:
if... then echo ... elif... than echo ...else echo ...
()小括号,需要使用数学符号如:>,<,=,&&,||等
[] 中括号,需要使用字符标示如:-eq,-lt,-gt,&& ||等
[] 中括号,严格需要留有空格。
疑问:
为什么使用双的小括号和中括号?
为什么要区别数学符号和字符标示使用括号?
8、字符串 和 文件状态测试
-z 为空字符串(长度为0)时返回真
-n 为非字符串时返回真
-d 存在并且是一个目录时返回真
-f 存在并且是正规文件时返回真
实例1:
#!/bin/bash
echo "---字符串 和 文件状态测试-1---"
echo "----------"
read string
if [ -z $string ]
then
echo "你输入的信息为空"
else
echo "你输入的内容:""$string"
fi
-------------------
实例2:
#!/bin/bash
echo "---字符串 和 文件状态测试-2---"
echo "请出入一个文件或者目录的名称:"
read string2
if [ -z $string2 ]
then
echo "你输入的信息为空"
exit
else
if [ -f $string2 ]
then
echo "这是一个文件"
elif [ -d $string2 ]
then
echo "这是一个目录"
else
echo "不存在这个文件或者目录"
fi
fi
--------------------
9、case...esac 的使用和通配符
case... in ... esac
实例1:
#!/bin/bash
echo "---case...esac 的使用和通配符-1---"
echo "1 - 普通显示"
echo "2 - 详细显示"
echo "3 - 显示隐藏文件"
echo "4 - 退出"
echo "选择不同的显示文件和目录方式,请输入编号:"
read num1
case $num1 in
1) ls;;
2)ls -l;;
3)ls -la;;
4)exit;;
esac
----------------------
* 通配符,标示0或者0以上的全部匹配。
${file1##*.} 字符串的截取,意思为截取文件名“.”之后的字符串
例如:test.gz 截取后为gz
实例1:
#!/bin/bash
echo "---case...esac 的使用和通配符-2---"
echo "请输入要解压的文件名"
read file1
case "${file1##*.}" in
gz) tar -xzvf ${file1}
;;
zip) unzip ${file1}
;;
*) echo "很抱歉,无法解压这种格式"
;;
esac
------------
实例2:
#!/bin/bash
echo "---case...esac 的使用和通配符-3---"
echo "请输入要解压的文件名"
read file2
case ${file2} in
*.gz)
tar -xzvf ${file2}
;;
*.zip)
unzip ${file2}
;;
*)
echo "很抱歉,无法解压这种格式"
exit
;;
esac
---------------------
疑问:
1.为什么是两个“;”呢?
2.为什么用“”和{}这个符号呢?
3.为什么用##这个符号?
10、for循环 和while循环
for语句要求shell将包含在这个语句中的一组命令连续执行一定的次数.
语法格式:
bash/pdksh
用法1:
for var1 in list
do
commands
done
含义:在这个for语句中,对应于list中的每个值,shell将执行一次commands代
表的一组命令.在整个循环的每一次执行中,变量var1将依此取list中的不同的
值.
while语句是shell提供的另一种循环语句. while语句指定一个表达式和一组
命令.这个语句使得shell重复执行一组命令,直到表达式的值为False为止.
语法格式:
while expression ;bash
do
statements
done
-----------
while (expression) ;tcsh
statements
end
实例1:
#!/bin/bash
echo "---for循环 和while循环-1---"
for a in `seq 1 2 10`
do
echo $a
done
------------
实例2:
#!/bin/bash
echo "---for循环 和while循环-2---"
for (( i=1;i<=10;i=i+2 ))
do
echo $i
done
----------
实例3:
#!/bin/bash
echo "---for循环 和while循环-3---"
echo "统计文件的数目"
i=0
for name1 in `ls /etc`
do
# echo $name1
i=`expr $i + 1`
done
echo "文件总数:"$i
------------------------
实例4:
#!/bin/bash
echo "---for循环 和while循环-4---"
a=0
while [ $a -le 10 ]
do
((a=a+1))
if [ $a -eq 5 ]
then
continue
elif [ $a -eq 8 ]
then
break
else
echo "a的值为:" $a
fi
done
--------------------------
实例5:
#!/bin/bash
echo "---for循环 和while循环-5---"
echo "客户登记"
while true
do
echo "登记客户资料(c继续,q退出):"
read choese
case $choese in
c)
echo "请输入客户名字:"
read name
echo "请输入客户年龄:"
read age
echo "名字:"$name"-年龄:"$age >>
customer.txt
;;
q)
break
;;
*)
echo "请确认是否需要登记"
esac
done
---------------------------
注:实例3不明白。
>> customer.txt 表示追加保存到customer.txt文件中,如果文件不存在会自
动创建。
> customer.txt 表示覆盖原有的数据。
疑问:
命令:tee、sed、awk
11、until语句
until与while语句具有类似的语法格式和功能,不同的是while中expression的
值为True时,shell执行命令组;而until中当expression的值为False时,shell
才执行那组命令.
语法格式:
until expression
do
commands
done
12、shift语句
bash和tcsh都支持shift命令.shift将存放在位置变量中的命令行参数,依次向
左传递.
例如
位置变量当前值为:
$1=file1 $2=file2 $3=file3
执行一次shift命令后,位置变量的值为:
$1=file2 $2=file3
还可以在shift命令中指定位置变量转移的次数
13、select语句
语法格式:
select menu [in list_of_items]
do
commands
done
含义:当执行一个select语句时,pdksh分别为每个列在list_of_items中的成员
建立一个菜单
选项.list_of_items既可以是一个包含多个选项的变量,也可以是直接列在程
序中的一组选项
.如果语句中没有提供list_of_items,select语句将使用位置变量作为
list_of_items.
实例1:
#!/bin/bash
echo "---select语句使用-1---"
echo "你喜欢什么科目?"
select name in 语文 数学 化学 英语 物理 生物
do
#第二种方法:
case $name in
语文)
break
;;
数学)
break
;;
化学)
break
;;
英语)
break
;;
物理)
break
;;
生物)
break
;;
*)
echo "你选择的科目不存在,请重新输入
喜欢的科目。"
esac
done
echo "你喜欢的科目是:"$name
-------------------------------------
关键字"break" 用来跳出循环。
关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
14、函数
语法格式:
fname (){
shell comands
}