您的位置:首页 > 运维架构 > Shell

linux shell 简单用法

2013-10-09 17:34 239 查看
1. Linux shell中, 可以将linux 中的命令放入到 xxx.sh文件中, 构成一个shell脚本。

2. Linux 管道表示 “ | ” , 例如 A | B , 即是将A 命令执行的结果, 做为传入, 给B命令执行, 例如: ls -l | grep http , 意思为:显示当前目录下所有文件, 过滤出包含“http”字符的文件。

3. 重定向: < , > , >> , < 是将 < 右边的作为左边的输入, > 是重新写入, 通常是到文件中 “ls -l > a.txt ” , >> 是追加操作, 将数据从文件的末尾添加上去, 不从文件的头部开始写。

2> 就是将命令中错误的信息重新定向 , 还有类似的 2>> , 此为追加操作。

0表示标准输入 ,1表示标准输出 ,2表示标准错误输出 ,> 默认为标准输出重定向,与1> 相同 , 2>&1 意思是把标准错误输出重定向到标准输出。 &>file表示标准输出和标准错误输出都重定向到文件file中。

4. 命令协作: &&, || , ; && 两个命令都需要执行成功, || 如果前面的命令执行成功, 则不执行后面的命令 , 跟C语言中的类似。 ; 表示, 前面的命令执行完后, 紧接着执行后面的命令。

5. 变量定义

Linux shell 可以直接定义变量, 形式为 变量名 = 变量值 , 如果 hello = haha , 如果要利用该变量的值,在前面需要添加上 $hello 来取到变量的值。测试例子:

命令行中: hello = haha 回车 echo $hello 显示 haha (赋值时, = 号前后最好不要留有空格)

6 . 双引号 , 和 单引号 , 反撇号(键盘1左边的那个按键)

双引号中是允许有引用的如在双引号中有开始定义的$hello , 则在执行过程中 会当作haha 来处理, 如果使用单引号扩起来的, 则会直接输出, 不管是否是引用。

echo "$hello" 显示 haha 而 echo '$hello' 显示 $hello 。反撇好, 包含的内容不是字符串, 而是一个命令, 可将其包含的` `执行后的结果, 做其他用, 比如赋值。

7 . 由系统或脚本控制,不可直接赋值的特殊变量

$? : 前一条命令的状态值, 0 为正常 , 非0异常

$0 : 脚本自身的程序名

$1 - $9 : 第1-第9个位置参数

$* : 命令行的所有位置参数的内容

$# : 命令行的位置参数个数

8 . 计算表达式, 可以用expr 命令 , 格式是 expr 数值1 操作符 数值2 或者 使用 $[] , 格式是 $[数值1 操作符 数值2] , 例如:kkk = `expr 1 + 3 ` echo $kkk 显示4 , 而 $[1 + 3] , 这个结果会替换这个式子本身 , 也是4 。在expr使用 * 的时候, 我们需要用一个 \* , 因为 * 在linux 系统中是通配符。而在利用 $[]的时候, 无需要转义。

9 . let 变量名++ , let 变量名-- , 变量的递更处理。 也可以这样用 X+=2 。 RANDOM是一个特殊的变量, 它可以生成随机数。seq 可以生成数字序列, 用法为:

seq 首数 末数 , 生成首数到末数之间的数, 如果首数没有指定, 则从1开始到末数, 步长默认为1 ,例如:seq 3 , 则显示 1 2 3 。还有一种语法是 seq 首数 步长 末数 , 这样就显示从首数开始递增加步长, 直到超过末数。 用bc 来做小数处理,例如: echo "45.67-21.45" | bc , 由于小数在除法的过程中可能会出现无限循环的小数, 则我们需要有时候需要限制小数的小数位数, 例如: echo “scale =4; 10/3 ” | bc 利用 scal=n
来指定位数。

10 . 字符串截取操作

dirname 命令, 显示文件的文件夹位置, basename命令, 显示文件的文件名。expr substr $var1 起始位置 截取长度 , 还可以使用 ${}表达式, 来截取字符串格式: ${var1:起始位置:截取长度}。expr 截取的起始位置是从1开始编号的, 而 $var的起始位置是从0开始编号的。所以在使用这两个字符串截取时候,需要注意相差一位。$截取时,如果起始位置省略,就从头开始截取, 写法为${var::4}。

11. 字符串替换

格式一:${var/old/new} ,将var变量值中第一个old字符串用new来替换 ,格式二: ${var//old/new} ,将var变量值中的所有的old都用new来替换。

12. 测试操作规范: test 条件表达式 或者 [条件表达式] 。

13. 存在及识别 : -e : 目标是否存在(Exist) -d: 是否为目录(Directory) -f :是否为文件(File) 。权限的检测 : -r :是否有读取(Read)权限 ,-w : 是否有写入(Write) 权限

-x : 是否有可执行(eXcute)权限。整数值比较: -eq:等于(Equal) , -ne : 不等于(Not Equal) , -gt: 大于(Greater Than),-lt : 小于(Lesser Than) , -ge : 大于或等于(Greater or Equal) , -le: 小于或等于(Lesser or Equal)。例如:[$(who | wc -l) -eq 2 ] && echo "yes" 。

14. 单分支if语句结构: 双分支if语句结构: 多分支if语句结构

if 条件测试 if 条件测试 if 条件测试1

then 命令序列 then 命令序列1 then 命令序列1

fi else 命令序列2 elif 条件测试2

fi then 命令序列2

.........

else 命令序列n

fi

15 . for 循环语句格式:

for 变量名 in 取值列表

do

命令序列

done

16 . case 语句格式:

case 变量值 in

模式1 )

命令序列1

;;

模式2 )

命令序列2

;;

* )

默认命令序列

esac

17 . 如果脚本需要被系统调用chkconfig来管理, 首先需要能够识别start | stop 命令, 对于有些系统red hat centOS ,

需要在普通的shell脚本开头添加chkconfig的相关参数:

#/bin/bash

#chkconfig -90 10

#description: 描述的语句

我们还需要将我们的脚本放到/etc/init.d/下面, chkconfig --add 脚本 , 添加后chkconfig就能够管理这个shell服务脚本了。

举例说明shell文件名为(shelllinux):

#!bin/bash
#chkconfig -90 10
#description: this is my shell!
case "$1" in
start)
echo "start";
`ls >> /usr/start.txt` ;
sleep  3600 &
;;
stop)
echo "stop"
pkill -x "sleep"
;;
*)
echo "you can [start|stop]"
esac

然后将,shelllinux文件放入到/etc/init.d/下面, chkconfig --add shelllinux ,OK ,搞定了!如果想要开机自动运行, 就chkconfig shelllinux on 。

对于ubuntu, 它没有chkconfig , 我们可以用update-rc.d 命令来。

添加的头block是这样的:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

再执行update-rc.d shelllinux defaults 这样重启过后,我们的脚本就会在系统启动的时候加载执行了,判断脚本是否执行,观察case start), 后面执行命令序列的效果。

如果不希望执行只需要update-rc.d -f shelllinux remove 即可!了解更多,请了解运行级别。

18 . awk基本命令格式:

awk '模式 {操作}' 文件1 文件2 例如:awk 'NR==1{print}' /etc/hosts, 就会显示第一行/etc/hosts

awk命令有很多的内置变量:

NR :当前处理行的序数(行号)

FS : 字段分隔, 缺省为空格或Tab位

$n : 当前行的第n个字段

$0 : 当前行的所有文本内容

示例文本(file.txt):

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash

命令行中执行:awk 'NR==1,NR==3{print}' file.txt 就会显示从第1行到第3之间的所有内容。

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy

命令行中执行:awk '(NR==1)||(NR==3){print}' file.txt 就会显示

1 This is the first line.
3 192.168.4.2 sss.eee.yyy

还可以按照奇偶行来输出: awk '(NR%2)==0{print}' file.txt 显示如下

2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash

awk 还可以使用正则表达式, 用/ /包含出来。 awk '/2/{print}' file.txt (打印所有包含2字符所在的行)

2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy

awk '/bash$/{print}' file.txt (打印所有包含以bash结尾的行, 这里的$符号是表示结尾的意思)

4 hunter:x:504:504::/home/sely:/bin/bash

指定输出字段: awk 'NR==2,NR==3{print $1,$3}' file.txt

2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy

指定按照字符分隔用法: awk -F. '$5=="eee"{print $0}' file.txt (-F指定分隔符这里是“ . ” , 指定第五个字段为"eee“ ,就输出整行)

3 192.168.4.2 sss.eee.yyy

19 . seb 语法格式:

sed '编辑指令' 文件1 文件2 .....

sed -n '编辑指令' 文件1 文件2 ....

sed -i '编辑指令' 文件1 文件2 ....

例如: sed -n '3,5p' /etc/hosts (将/etc/hosts内容中的第3行到第5行p=print出来)。

编辑指令的写法: 格式:[地址1[,地址2]] 操作类型, 多条指令之间以分号隔开。 sed -n '3p;5p' /etc/hosts (输出第3行和第5行)。如果多个单引号区间, 则他们之间需要加上 -e隔开。常用的操作类型有:

p 输出/打印文本行 n 取下一行文本(跳过当前行) d 删除 s 字符串替换 a 追加新的文本。

为了测试sed 命令,我们同样建立个file.txt文本:

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash

输出所有的奇数行: sed -n 'p;n' file.txt

1 This is the first line.
3 192.168.4.2 sss.eee.yyy

输出所有的偶数行: sed -n 'n;p' file.txt

2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash

使用正则表达式: sed -n '/eee/,$p' file.txt (输出eee所在的行到最后一行的内容)

3 192.168.4.2 sss.eee.yyy4 hunter:x:504:504::/home/sely:/bin/bash

使用正则表达式查找单词所在的行: sed -n '/\<This\>/p' file.txt (\是用来转义<和>的)

1 This is the first line.

删除符合条件的行: sed '2,3d' file.txt (会将file.txt中的第2行到第3行之间的内容删除后,显示出剩下的文本,不会涉及到file.txt的实际内容)

1 This is the first line.
4 hunter:x:504:504::/home/sely:/bin/bash

删除符合条件的行和最后一行: sed '/eee/d;$d' file

1 This is the first line.
2 Hello, Everybody!

删除不符合条件的行: sed '/eee/!d' file.txt 如果在前面加 -i 就会影响到文件的内容。

3 192.168.4.2 sss.eee.yyy
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: