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

浅析shell编程

2015-05-12 22:06 176 查看
shell诞生于Unix,是与unix/linux交互的工具。shell 编程指令简单、灵活、高效;可移植性高;可以实现自动化管理,它特别适合处理一些小问题。本文会尝试总结一些常用的shell编程指令和学习一些增加编程效率的技巧,并把目录分为shell编程基础、文本处理、文件处理、系统管理类、用户管理类、其他指令和遇到的一些问题,共七部分分别进行介绍。

所谓磨刀不误砍柴工吧,这些基础知识确实可以增加你的工作效率。本文的主要目录如下:

一、编程基础

二、文本处理

三、文件处理

四、系统管理

五、用户管理

六、其他指令

七、遇到的问题和处理方法

一、编程基础:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: