浅析shell编程
2015-05-12 22:06
176 查看
shell诞生于Unix,是与unix/linux交互的工具。shell 编程指令简单、灵活、高效;可移植性高;可以实现自动化管理,它特别适合处理一些小问题。本文会尝试总结一些常用的shell编程指令和学习一些增加编程效率的技巧,并把目录分为shell编程基础、文本处理、文件处理、系统管理类、用户管理类、其他指令和遇到的一些问题,共七部分分别进行介绍。
所谓磨刀不误砍柴工吧,这些基础知识确实可以增加你的工作效率。本文的主要目录如下:
一、编程基础
二、文本处理
三、文件处理
四、系统管理
五、用户管理
六、其他指令
七、遇到的问题和处理方法
一、编程基础:
1. shell变量:
shell是一种弱类型的语言,使用变量无需声明类型。shell变量为当前shell进程私有,如果使用export可以把变量声明为系统变量,那么所有的进程均可以使用。 其中对环境变量操作的命令如下:
其中declare是一种功能强大的声明指令,可以用来声明变量、函数、声明全局变量。具体用法:declare [+/-][rxi][变量名称=设置值] 或 export [-fnp][变量名称]=[变量设置值]。
2. 条件控制类:if, for, while, case:
3. shell参数传递:
4. shell注释:
二、文本处理类:
shell文本处理的指令很多,并且功能强大。包括基础的指令如:echo, vi, more, cat, tail , less,vimdiff 管道指令 | , < , > , <<,支持更多的扩展的指令如 awk, sed, tr。
1. vi编程技巧:
a. 基本指令:
b. 窗口切分:
c. tags使用:
2. awk:
awk是一种功能强大的文本处理工具,它提供了极强大的功能,可以样式装入,流控制,数学运算符,进程控制符号,内置变量和函数。
3. sed:
4. ctags:
5. 常用组合键:
三、文件处理类:
四、用户管理类:
五、系统管理类:
六、其他:
七、问题及解决办法:
1. 去除字符串前面的0。
2.ubuntu 执行shell脚本,报错Syntax error: "(" unexpected解决方法的方法:
写了一些简单的shell脚本,简单的数组处理,可是却无法编译执行。后来仔细检查代码和搜索发现:因为Ubuntu为了加快开机速度,用dash代替了传统的bash,是dash在捣鬼。现在我们可以 取消dash。
sudo dpkg-reconfigure dash 。然后在弹出的窗口中选择否。
3. 重用ssh连接:ssh有一个功能,可以在第一次打开以后一直保留这个ssh连接,后续继续打开的ssh连接会继续使用这个ssh连接的TCP连接,也就是下次不用输入密码了。简单方便:
vi ~/.ssh/config, 添加如下内容(然后再次建立ssh连接,就可以愉快的不用输入密码了):
参考文献:
[1]. vim 分割窗口: http://www.linuxidc.com/Linux/2012-08/69363.htm
[2]. vi命令大全 http://www.cnblogs.com/88999660/articles/1581524.html
[3]. awk 编程总结: http://bbs.chinaunix.net/thread-691456-1-1.html
[4]. sed 编程总结: http://www.iteye.com/topic/587673
[5]. ssh 的连接重用:http://www.fwolf.com/blog/post/385
所谓磨刀不误砍柴工吧,这些基础知识确实可以增加你的工作效率。本文的主要目录如下:
一、编程基础
二、文本处理
三、文件处理
四、系统管理
五、用户管理
六、其他指令
七、遇到的问题和处理方法
一、编程基础:
1. shell变量:
shell是一种弱类型的语言,使用变量无需声明类型。shell变量为当前shell进程私有,如果使用export可以把变量声明为系统变量,那么所有的进程均可以使用。 其中对环境变量操作的命令如下:
env #用于显示用户环境区中的变量及其取值; set #用于显示本地数据区和用户环境区中的变量及其取值; unset #用于删除指定变量当前的取值,该值将被指定为NULL; export #命令用于将本地数据区中的变量转移到用户环境区。 source #当前环境下执行并读取filename下文件的内容、命令。与bash的区别是bash只会影响子进程
其中declare是一种功能强大的声明指令,可以用来声明变量、函数、声明全局变量。具体用法:declare [+/-][rxi][变量名称=设置值] 或 export [-fnp][变量名称]=[变量设置值]。
2. 条件控制类:if, for, while, case:
a=1 if [ $a"x" == "1x" ];then echo "Hello 1"; fi if [ $a -eq 1 ];then echo "Hello 2"; fi if [[ $a -eq 1 ]];then echo "Hello 3"; fi while true do echo "abcdef"; break; done for((i=1;i<=10;i++)) do echo $(expr $i \* 4) break; done -r file #用户可读为真 -w file #用户可写为真 -x file #用户可执行为真 -f file #用户为文件为真,存在 -d file #文件尾目录为真 -c file #文件为字符特殊文件为真 -b file #文件为块特殊文件为真 -s file #文件大小非0为真 -t file #文件描述符指定设备为终端时为真
3. shell参数传递:
sh a.sh #!/bin/bash echo $# #传递给脚本的参数个数 echo $* #表示所有向脚本传递的参数。 echo $@ #与$#相同,使用时加上引号,并在引号中返回每个参数 echo $? #返回上一个命令的退出状态 echo $! #返回后台运行的最后一个进程的进程ID号。 func fsum(){ echo $1+$2; } func 5 7
4. shell注释:
sh a.sh #!/bin/bash #这是一个注释 :<<\EOF 这是另一个高手 echo "this is comments" EOF
二、文本处理类:
shell文本处理的指令很多,并且功能强大。包括基础的指令如:echo, vi, more, cat, tail , less,vimdiff 管道指令 | , < , > , <<,支持更多的扩展的指令如 awk, sed, tr。
1. vi编程技巧:
a. 基本指令:
h #向上 j #向左 k #向右 l #向下 a #插入 o #插入一行,并在行首开始 O #在当前行前插入一行,并在行首开始 dd #删除当前行 x #删除当前字符 yy #复制当前行 p #在当前行后面粘贴 P #在当前行前面粘贴 10G #光标到第10行 G #到文件末尾 0 #行首 u #撤销 ctrl+v #多列操作 ctrl+r #撤销刚才的撤销操作 ctrl+f/b #下一页/上一页 shift+# #查找当前单词的下一个出现位置 :set nu #显示行号
b. 窗口切分:
split/vsplit #垂直/水平切分 ctrl+w+w #切换窗口 :quitall #全部退出 :only #只保留当前窗口 :wall #全部保存 :edit file #打开文件file编辑 vi -o a.sh b.sh #打开a.sh和b.sh并切分窗口编辑
c. tags使用:
:tags=tags file #指定tag文件 ctrl+] #跳转到当前单次定义处 ctrl+T #跳转回远处</span>
2. awk:
awk是一种功能强大的文本处理工具,它提供了极强大的功能,可以样式装入,流控制,数学运算符,进程控制符号,内置变量和函数。
NR #行号 NF #列号 ARGIND #文件编号 BEGIN{} #初始化执行的语句 {} #每行都执行的语句 END{} #最后执行的语句 echo "12 23"| awk' #awk函数定义的变量全部是全局变量, function max(a,b,c){ #在awk的非函数里面使用"''"可以引用bash定义的变量,awk的函数里面只能使用局部变量 a = 1; b = 2; c = 3; print a,b,c return a > b ? a : b; }{print max($1,$2);print a,b,c}' awk '/101/,/102/' file #查找匹配的行 awk '$1=='test'{$3="Change"}' #条件修改 awk '{if($0~/101/) print $0}' file #从file文件逐行读入,并查找匹配行 #awk内置函数 artan2/cos/exp/int/log/sin/sqrt #内置数学函数 length(str) #返回字符串长度 array=split(str,','); #把字符串切分成数组 substr #返回字符串的子串 var=${var//,/ /} #把,替换成空格,并且可以使用for item in var
3. sed:
sed -n '1,5p' file #只显示1-5行 sed '1,5d' file #去除1-5行 sed '/^ *$/d' file #删除空格行 cat file | tr " " "\t" > file1 #替换空格为\t sed '/[a-z]/d' file #删除匹配行 #中文处理: cat a | tr -d -c $'[a-z0-9\.\?\_ \r\t\n{}()!?]' #删除文件中中文 cat file | grep -Po '(?<=")[^!-~]+' #提取文件中中文 tr -d $'[a-zA-Z\.\?\_+\r{}()!?,/\-"\':<>%]' | sed 's/《//;s/「//;s/」//;s/、//;s/》//;s/》//;s/〕//;s/(//;s/②//;s/①//;s/③//;s/《//;s/》//' #仅保留文件中中文
4. ctags:
5. 常用组合键:
ctrl+z #当前任务切换到后台执行 ctrl+d #结束输入或退出shell ctrl+s #暂停屏幕输出 ctrl+q #恢复屏幕输出 Ctrl+a #切换到命令行开始处 ctrl+e #切换到命令行末尾 ctrl+u #剪切清除光标之前的内容 ctrl+k #清除光标及光标以后的内容 ctrl+y #在光标处粘贴剪切的内容 ctrl+r #查找历史命令 ctrl+t #调换光标与光标前字符,并且换光标到下一个字符 ctrl+x+u #撤销操作
三、文件处理类:
mv #移动文件/重命名 cp #拷贝文件 rm #删除文件夹 -rf 删除目录并且忽略提示 find ./ -name filename #查找文件 locate #全部计算机查找文件 find. | xargs grep -ri "IBM" #查找当前目录下包含IBM的文件
四、用户管理类:
useradd username -d /home/username -s /bin/bash -g usergroup -G useradditionalgroup #移动文件/重命名 passwd username #修改用户密码 userdel username #删除用户
五、系统管理类:
du -d 1 -h * #查看当前目录文件大小 netstat -nao #查看进程占用端口号 mount /dev/sda3 /mnt/mount #加载硬/U盘 fdisk -l #查看电脑硬盘占用情况 df #查看电脑分区使用情况 top #查看运行进程 kill/killall #杀死进程 ps -ef | grep processname | grep -v grep | cut -d " "-f 2 | xargs kill -s 9 #杀死进程 screen #终端屏幕管理工具 polysh #多机log管理工具
六、其他:
ctrl+z #把当前进程暂停,并切换到后台 jobs #查看后台运行进程 fg 1 #把第一个进程放置到前台执行 bg 1 #把第一个进程放置到后台执行 alias command1 command2 #把command1的别名设置为command2 #vimdiff zf #创建折叠 za #切换折叠状态 zo #打开折叠 zc #关闭折叠 zr #打开所有折叠 zm #关闭所有折叠 zj/zk #下一折叠开始/上一折叠末尾 dp #拷贝另一个文件的当前行到当前文件中 do #拷贝另一个文件的内容到当前文件中
#crontab 定时任务 crontab -e #打开计划任务管理界面 00 14 * * 7 cd pwd; sh execute.sh 1>log 2>err & #定时开启计划任务 分/时/日/月/星期 nohup sh execute.sh 1>log 2>err & #建立终端断开仍会继续执行的异步任务
七、问题及解决办法:
1. 去除字符串前面的0。
2.ubuntu 执行shell脚本,报错Syntax error: "(" unexpected解决方法的方法:
写了一些简单的shell脚本,简单的数组处理,可是却无法编译执行。后来仔细检查代码和搜索发现:因为Ubuntu为了加快开机速度,用dash代替了传统的bash,是dash在捣鬼。现在我们可以 取消dash。
sudo dpkg-reconfigure dash 。然后在弹出的窗口中选择否。
3. 重用ssh连接:ssh有一个功能,可以在第一次打开以后一直保留这个ssh连接,后续继续打开的ssh连接会继续使用这个ssh连接的TCP连接,也就是下次不用输入密码了。简单方便:
vi ~/.ssh/config, 添加如下内容(然后再次建立ssh连接,就可以愉快的不用输入密码了):
Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
参考文献:
[1]. vim 分割窗口: http://www.linuxidc.com/Linux/2012-08/69363.htm
[2]. vi命令大全 http://www.cnblogs.com/88999660/articles/1581524.html
[3]. awk 编程总结: http://bbs.chinaunix.net/thread-691456-1-1.html
[4]. sed 编程总结: http://www.iteye.com/topic/587673
[5]. ssh 的连接重用:http://www.fwolf.com/blog/post/385
相关文章推荐
- shell编程之函数浅析
- linux子系统分析及触摸屏驱动浅析
- 浅析 Java Thread.join()
- AutoRelease 浅析
- Android学习笔记:浅析setContentView
- 浅析轮询(Polling)和推送(Long-Polling)服务
- linux中断处理浅析
- shell编程练习题
- C++ transform 浅析
- 在Docker容器中不需要运行sshd的原因浅析
- C语言程序设计——知识点浅析
- C#Windows服务程序开发实例浅析
- 关于js中for in的缺陷浅析
- 一个程序演示所有的shell编程知识
- 如果软件测试是门艺术,软件测试工程师就是艺术家 -- 浅析ZStack是如何做智能软件测试
- shell编程之select循环用法
- Shell编程基础
- pos和posp的密钥管理浅析
- C++ 获取类成员函数地址方法 浅析
- 浅析JavaScript访问对象属性和方法及区别