06_03_bash脚本编程之五 字符串测试及for循环 07_01_vim编辑器详解

字符串测试:

    == : 测试是否相等, 相等为真, 不等为假

    != : 测试是否不等, 不等为真, 等为假

>

<

    -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:忽略大小写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容