shell编程学习笔记

一、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
}

猜你喜欢

转载自chxw00.iteye.com/blog/1749816
今日推荐