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):
然后将,shelllinux文件放入到/etc/init.d/下面, chkconfig --add shelllinux ,OK ,搞定了!如果想要开机自动运行, 就chkconfig shelllinux on 。
对于ubuntu, 它没有chkconfig , 我们可以用update-rc.d 命令来。
添加的头block是这样的:
再执行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):
命令行中执行:awk 'NR==1,NR==3{print}' file.txt 就会显示从第1行到第3之间的所有内容。
命令行中执行:awk '(NR==1)||(NR==3){print}' file.txt 就会显示
还可以按照奇偶行来输出: awk '(NR%2)==0{print}' file.txt 显示如下
awk 还可以使用正则表达式, 用/ /包含出来。 awk '/2/{print}' file.txt (打印所有包含2字符所在的行)
awk '/bash$/{print}' file.txt (打印所有包含以bash结尾的行, 这里的$符号是表示结尾的意思)
指定输出字段: awk 'NR==2,NR==3{print $1,$3}' file.txt
指定按照字符分隔用法: awk -F. '$5=="eee"{print $0}' file.txt (-F指定分隔符这里是“ . ” , 指定第五个字段为"eee“ ,就输出整行)
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文本:
输出所有的奇数行: sed -n 'p;n' file.txt
输出所有的偶数行: sed -n 'n;p' file.txt
使用正则表达式: sed -n '/eee/,$p' file.txt (输出eee所在的行到最后一行的内容)
使用正则表达式查找单词所在的行: sed -n '/\<This\>/p' file.txt (\是用来转义<和>的)
删除符合条件的行: sed '2,3d' file.txt (会将file.txt中的第2行到第3行之间的内容删除后,显示出剩下的文本,不会涉及到file.txt的实际内容)
删除符合条件的行和最后一行: sed '/eee/d;$d' file
删除不符合条件的行: sed '/eee/!d' file.txt 如果在前面加 -i 就会影响到文件的内容。
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
相关文章推荐
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- linux shell 简单用法
- Linux shell ${}简单用法
- linux shell ${}简单用法
- 【转】linux shell ${}简单用法
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- Linux shell ${}简单用法
- linux shell$()的简单用法
- Linux shell ${}简单用法
- linux shell ${}简单用法
- linux shell ${}简单用法,及$()
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法
- EventBus的简单用法
- Python中内建函数的简单用法说明
- Android Scroller简单用法