shell语言
1.一些基本的shell命令(1)shell引用操作符:
‘’:单引号,禁止任何元字符转义,在‘’中的都作为普通字符a=1;echo '${a}'->${a}
“”:双引号,只允许变量替代和命令替代${},$()a=1;echo "${a}"-> 1
\ :元字符转义
(2)shell变量扩展
${#variable}替换变量中字母的个数。如果*或者@,长度就是位置参量的个数
${va:-WORD}:当变量未定义或值为空时,输出值为WORD的,否则返回变量的值。
${va:=WORD}:当变量未定义或值为空时,输出WORD并将WORD字符串赋给va变量,否则返回变量值。
${va:+WORD}:当变量非空时,输出WORD,否则输出空。
${va:?MESSAGE}:当变量非空时,正常输出va的值。否则将消息MESSAGE送到标准错误输出(若此替换出现在SHELL程序中,那么该程序将终止运行)。
符号含义:#左删除 %右删除 /替换 :取子串
(2.1)删除子串
var=http://www.linuxidc.com///test.htm
1). # 最小左删除子串:从左向右最小匹配截取,删除左边字符,保留右边字符。
例子:echo ${var#*//}
说明:其中 var 是变量名,# 号是运算符,*// 匹配最小的左边字符串
结果:www.linuxidc.com/test.htm
2). ## 最大左删除子串:从左向右截取,删除左边字符,保留右边字符。
例子:echo ${var##*/}
说明:##*/ 在var中匹配最大字符串,删除左边字符,保留右边字符。
结果:test.htm
3). %最小右删除子串:从右向左匹最小匹配截取,删除右边字符,保留左边字符
例子:echo ${var%/*}
说明:在var中从右向左匹配最小字符串,删除右边字符,保留右边字符。
结果:http://www.linuxidc.com//
4). %% 最大右删除子串:从右向左匹最大匹配截取,删除右边字符,保留左边字符
例子:echo ${var%%/*}
说明:%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
(2.2)取子串
var=http://www.linuxidc.com///test.htm
5). 左数取子串:从左边第几个字符开始,截取字符的个数
例子:echo ${var:0:5}
说明:其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果:http:
6). 左数至尾取子串:从左边第几个字符开始,一直到结束。
例子:echo ${var:7}
说明:其中的 7 表示左边第8个字符开始,一直到结束。
结果:www.linuxidc.com/test.htm
7). 右数取子串:从右边第几个字符开始,截取字符的个数
例子:echo ${var:0-8:4}
说明:其中的 0-8 表示右边算起第8个字符开始,4 表示截取的字符的个数。
结果是:test
8). 右数至尾取子串:从右边第几个字符开始,一直到结束。
例子:echo ${var:0-8}
说明:表示从右边第8个字符开始,一直到结束。
结果是:test.htm
(2.3)替换子串
var=http://www.http.com///test.http
9). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
例子:echo ${var/http/ftp}
说明:从左边起,替换第一个匹配的子串http为ftp
结果:ftp://www.http.com///test.http
10).全局替换子串:将匹配的字符全部替换为指定的子串
例子:echo ${var//http/ftp}
说明:将匹配的http字符全部替换为指定的ftp
结果:ftp://www.ftp.com///test.ftp
11). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
例子:echo ${var/#http/ftp}等价于 echo ${var/http/ftp}
说明:从左边起,替换第一个匹配的子串http为ftp
结果:ftp://www.http.com///test.http
12).右数替换第一个子串:从右边起,只替换第一个匹配的子串。
例子:echo ${var/%http/ftp}
说明:将匹配的http字符全部替换为指定的ftp
结果:http://www.http.com///test.ftp
(3)shell数学扩展
$[ expression ]
$(( expression ))
echo $[ (5 + 3) * 2]
16
echo $(( 5 + 4 ))
9
[]相当于test
(())相当于let
(4)shell重定向
<重新定向输入
>重新定向输出
>>追加输出
2>重新定向错误
&>重新定向错误和输出
>&重新定向错误和输出
2>&1重新定向错误到标准输出
1>&2重新定向标准输出到错误
>|重新定向输出的时候覆盖noclobber
filename如果是一个设备文件,就把这个文件作为标准输入和标准输出
(5)文件压缩与备份
gzip [-cdt#] 文件名
-c 将压缩的数据输出到频幕上,可以通过数据流重导向来处理
-d 解压缩
-t 检验一个压缩的文件的一致性,看文件压缩后是否有错误
-1 -9 -6 压缩等级,速度与压缩比例的权衡
#gzip man.config压缩该文件成 man.config.gz
#zcat man.config.gz 查看压缩文件.gz中的内容
#gzip -d man.config.gz 解压缩该文件
bzip2,bzip2 -d ,bzcat bzip2的压缩、解压缩和查看命令,扩展名为.bz2
tar 命令结合了gzip或bzip2的压缩功能
tat [-cxtzjvfpPN] 文件或目录 ...
-c 建立压缩文件的参数命令
-x 解压缩文件的参数命令
-t 查看tarfile里面的文件 (-cxt互斥)
-v 过程可视化,显示在频幕
-z 具有gzip属性,使用gzip压缩或解压缩
-j 具有bzip2属性,使用bzip2压缩或解压缩
-f 操作的文件名,带参数选项。
-p 使用源文件的原来属性(属性不会更具用户而变)
-P 可以使用绝对路径来压缩
-N 比后面接的日期还要新的文件才会被打包
tar -cvf /tmp/am.tar/am 将/am打包放到/tmp/am.tar里面,不压缩
tar -zcvf /tmp/am.tar.gz/am 将/am打包放到/tmp/am.tar.gz里面,在以gzip压缩
tar -ztvf /tmp/am.tar.gz查看压缩文件中的内容
tar -zxvf /tmp/am.tar.gz解压
dd if=文件名或设备of=文件名 bs=一个块的大小 count=块的个数 dd备份的目的是为了能恢复数据
dd if=/etc/passwd of=/tmp/ps.bak 将一个文件备份,类似于cp
dd if=/dev/hda of=/tmp/mbr.bakbs=512 count=1 读硬盘数据到文件,备份硬盘1个512字节大小块的数据
dd if=/dev/hda1 of=/tmp/filename.bak 备份整个分区
cpio是通过数据流重导向的方法,将文件输入/输出的一种方式。(通过重定向输入文件名来进行备份)
cpio -covB> 备份
cpio -icduv /dev/st0将数据备份到磁带机
cpio -icdvt < /dev/st0 检查磁带机上存在的文件名
cpio -icdvt < /dev/st0 >/tmp/contdir 将磁带机上的文件全部读入到/tmp/dontdir目录下
(6)一些基本命令及操作
(2)Set -x;set +x 打开/关闭命令调试的跟踪功能。stty -echo ;stty echo 关闭/打开自动打印输入字符
(3)$展开运算符。${}变量展开;$()命令展开;$(())和$[]数学运算展开。
(4)文件的类型有:d目录;l链接表;s套接字;b块设备;c字符设备;p管道
(5)touch file 创建一个文件,cat file 创建文件
(6)文件权限管理
chmod 777 file ;修改文件属主、组、其他访问权限
chown username file 改变文件属主
chgrp newgrp file 改变文件组
umask 000设置文件创建屏蔽字
(7)ln -s src_pathdes_path创建文件链接
(8)Cat file &;在后台运行该命令
delete(line["lk"]) 删除数组中的某个元素
(9)Read var1 var2 ... Varn 从终端读n个变量,以空格分隔
read -a vp 把数据读到数组vp
(10)Tee file;将管道数据保存在file中,并输出到终端
(11)变量操作
Uset var 清除变量 uset a
Set 显示所有变量,包括环境变量
Readonly 查看所有只读变量
Export var 导出var为环境变量,如果需要在两个不同的脚步中使用相同变量,需要将该变量导出为环境变量
(相当于C库函数的putenv())
Env 显示所有环境变量
一些环境变量:HOME,PATH,CDPATH,MAIL,EXINIT, LOGNAME,SHELL等
位置变量:
$?取命令的退出码,0为执行成功;
$#命令后的参数个数;
$n命令后的第n个参数
$*命令后的所有参数
$@命令后的所有参数
$$当前进程号
$0当前进程名
$!后台运行的最后一个进程
${a} 返回变量a的字符串
${#a}求变量a的字符串长度
(12).关于各种括号
():在子shell中执行一组命令,变量空间不同
$()和${}:$是展开运算符。$()命令展开,相当于` `;${}变量展开
[]:相当于test;(()):相当于let,let “i=i+1” ((i=i+1)); ((2>1))逻辑为true时,返回$?为0
$(())和$[]:相当于expr和let
let a=a+1
(12)test测试和let测试
一组命令[]: [ $x –gt $y ] ;[ "$name" = "" ]
复合命令[[]]: [[ $name == om ]] 《=》name==Tom||name==tom;[[ $name == om && $friend == "Jose" ]]
let命令和(()):专门测试数学表达式。 (( x > 2 )) ; (( x == 2 && y == 3 ))
(12)exit n 命令退出,0正常退出
(13)|| 和 &&
||前面命令执行失败后才执行后面命令,否则后面命令不执行。
&&前面命令执行成功后才执行后面命令,否则后面命令不执行。
(14)>file清空文件内容
(15)Basename filepath取文件基本名
(16)Exec 的两个作用:
1).执行命令 exec 命令
2).为文件指定描述符
exec 4>file1
exec 3 Wednesday 10:29:21
(26)Kill -l 列出所有的shell信号 及信号号
(27)Eval 将一个字符串当做命令执行
eval ‘cat test.txt’
eval‘a=b’ 产生a变量
(28)bc file 按行计算文件中的数学表达式,计算功能强大
echo ‘2+3.14’ | bc
(29)Su username 切换用户 sudo username 命令;在username模式下执行命令
(30)Pstree 输出当前的进程树
(31)怎样的命令适合在子shell中运行:
会影响当前shell环境的命令,希望执行完该命令,shell的环境不变,如:
(cd $dir; pwd) //这样命令执行完后,不会改变当前目录。 并且能将内容输出。
()命令表示在子shell中运行
(32)cut 用于提取子串
echo 'YYYYMMDD'| cut -c 1-4 //提取出YYYY
(33)cal month year 输出某年某月的日历排布
(34) ( ls; pwd; data ) > outputfile每个命令的输出都被送到名为outputfile的文件中,括号中的空格是必须的。
(35)作业控制:
jobs 查看当前所有进程的编号或状态
fg 进程编号 将该进程提到前台并运行
bg 进程编号 将该进程放到后台并运行
ctl+Z暂停当前前台进程,并放入后台
stop 暂停一个后台作业
kill 进程编号将该进程杀死
wait 进程编号等待该进程执行完
(36)shell元字符与文件名通配-元字符
*匹配零或多个字符
?匹配一个字符
匹配一个字符集中的一个字符;如a、b或c
[!abc]匹配一个字符集外的一个字符;如非 a、b或c
{a,ile,ax}匹配一个字符或一个字符集
[!a-z]匹配从a~z范围以外的字符
\转义或禁止元字符
2.文件名通配
shell中支持模糊的文件名,通配符包括三种:*,?,[]
*:通配文件名中的任何字符串,包括空
?:通配文件名中的任何一个字符
[]:通配[]中的任何一个字符
[!...]:通配非[]中的字符
ls *.doc ;输出所有.doc文件
ls f??*s;输出以f开头s结尾中间至少有2个字符的文件名。
ls *;列出以i或o开头的文件
ls*[!0-9]* ;列出不包括数字的文件
3.Tr命令:处理行中指定的单个字符。(非正则匹配)
tr 字符处理
有4个选项:
-t 缺省选项。替换 echo " liujin" | tr -t
-s 压缩。echo "aabbcc" | tr -s
-d 删除。echo "aabbcc" | tr -d
-c 对模式取反。echo "abc" | tr -cd 删除除ab以外的字符
例子:
Tr -s ‘’
页:
[1]