[shell] Bash编程总结
由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试、打包、安装包等。虽然相比C++编程,要简单、傻瓜,但其在类Unix系统中可以大大提高工作的效率。所以在此对脚本编程过程中一些注意事项进行简单的总结。
1. shell概述
shell是介于用户和类Unix操作系统内核(kernel)之间的一个接口,是为了保护内核不被用户误操作造成损害,在内核的周围建立一个外壳(shell)。
用户通过向shell提出请求,shell解释并将请求传给内核。而多个shell请求可以写在一个文件中,便构成了shell脚本,其自身是一个解释型程序设计语言(相对编译型程序设计语言),shell脚本支持绝大多数的高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构等,同时任何在Unix终端提示符能键入的命令都能放在shell脚本文件中。
使用较广的shell有:Bourne Again Shell(bash)、Bourne Shell(sh)、C Shell(csh)、Korn Shell(ksh)等,当前大部分类Unix系统里默认的shell都是bash。
查看当前环境所用的shell:『echo $SHELL』。
查看当前发行版可以使用的shell:『cat /etc/shells』。
2. Bash编程
shell脚本文件格式,
#!/bin/bash function1()
{
} function2()
{
} # 主程序
echo “hello world” # 打印hello world
...
...
...
Bash中以$开头的变量,
|
$# |
传递给脚本的参数个数 |
|
$* |
传递给脚本的所有参数的值 |
|
$@ |
同$* |
|
$$ |
脚本的进程号 |
|
$! |
后台运行的最后一个进程的进程号 |
|
$- |
显示shell使用的当前选项 |
|
$? |
显示命令(或函数)的退出状态,0为正确,1为错误 |
|
$0 |
shell脚本的程序名(文件名) |
|
$n |
脚本程序(或函数)的第n个参数选项(从1开始) |
字符串操作,
|
${#str} |
返回字符串变量str的长度 |
|
${str:n} |
返回str从第n个字符到最后的字串(n从0开始) |
|
${str:n:len} |
返回str从第n个字符开始,长度为len的字串(n从0开始) |
|
${str#pattern} |
删除str中开头部分与pattern匹配的最小部分 |
|
${str##pattern} |
删除str中开头部分与pattern匹配的最大部分 |
|
${str%pattern} |
删除str中结尾部分与pattern匹配的最小部分 |
|
${str%%pattern} |
删除str中结尾部分与pattern匹配的最大部分 |
|
${str/old/new} |
用new替换str中第一次出现的old |
|
${str//old/new} |
用new替换str中所有的old |
|
${str/#old/new} |
用new替换str前缀匹配到的old |
|
${str/%old/new} |
用new替换str后缀匹配到的old |
|
= |
判断两个字符串是否相同 |
|
!= |
判断两个字符串是否不相同 |
|
-n |
判断字符串长度是否大于零 |
|
-x |
判断字符串长度是否等于零 |
|
注:相比于awk、sed对字符串的各种操作,shell内置的字符串操作性能更高(最起码,不需要启动awk、sed等进程)。 |
|
文件状态的测试,
|
-d |
是否为目录 |
|
-f |
是否为文件 |
|
-L |
是否为符号链接 |
|
-r |
是否可读 |
|
-w |
是否可写 |
|
-x |
是否可执行 |
|
-a |
是否不为空 |
数值测试,
|
-eq |
相等 |
|
-ge |
大于等于 |
|
-le |
小于等于 |
|
-ne |
不等于 |
|
-gt |
大于 |
|
-lt |
小于 |
字符串测试,
|
-eq |
相等 |
|
-ge |
大于等于 |
|
-le |
小于等于 |
|
-ne |
不等于 |
|
-gt |
大于 |
|
-lt |
小于 |
逻辑运算符,
|
! |
逻辑取反 |
|
-a |
逻辑与 |
|
-o |
逻辑或 |
3. 脚本调试
|
sh -x a.sh |
跟踪脚本的执行,对脚本中每条命令先执行替换,然后显示,再执行 |
|
sh -v a.sh |
按输入的原样打印脚本中的每行,打印一行执行一行 |
|
sh -n a.sh |
对脚本进行语法检查,但不执行 |
4. 一些技巧
|
屏蔽命令打印 |
cmd > /dev/null # 屏蔽正常输出 cmd 2> /dev/null # 屏蔽错误输出 cmd > /dev/null 2> /dev/null # 屏蔽正常输出和错误输出 cmd > /dev/null 2>&1 # 屏蔽正常输出和错误输出 cmd &> /dev/null # 屏蔽正常输出和错误输出 |
|
命令是否执行成功 |
cmd && echo “failed” || echo “ok” |
|
连接文件1所有行 |
paste –sd “,” 1 # 用逗号连接 paste –sd “ ” 1 # 用空格连接 |
|
过滤文件1重复行 |
sort -u 1 |
|
设置临时环境变量 |
脚本文件中export作用于当前脚本程序, VAR=env_str cmd环境变量只用于该cmd(无须先export,再unset) |
|
字符串默认值 |
${str:-0} # 如果str没被声明或为空,设为0,可以用来判断命令行或者函数参数 |
|
特殊参数-- |
echo “abc-a” | grep -- -i # --后面的参数不会被当作选项解析 |
|
获取软链接指向文件 |
readlink file |
|
清空文件(或创建文件) |
echo “” > file cat /dev/null > file > file |
|
shell中多进程 |
使用(cmd)可以fork一个子shell来执行该命令,利用wait命令,等待所有子进程结束 |
|
…… |
…… |
|
待今后继续补充 |
[shell] Bash编程总结的更多相关文章
- 08 bash特性--shell脚本编程入门
shell脚本编程入门 编程语言介绍 编程语言分为:机械语言.汇编语言和高级语言: 计算机能识别的语言为机械语言,而人类能学习的并且能够方便掌握的为高级语言,所以,我们所编写的程序就要通过编译来转换成 ...
- shell脚本编程及bash特性
bash特性及bash脚本编程初步 终端,附着在终端的接口程序; GUI: KDE,GNome,Xfce CLI: /etc/shells bash的特性: 命令行展开: ~,{} 命令别名: ali ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
- Linux编程环境介绍(2) -- shell(Bash) 介绍
1. 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe. 2. bash (Bourne Aga ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程
Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...
随机推荐
- TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)
题意 Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...
- 【Jpa hibernate】一对多@OneToMany,多对一@ManyToOne的使用
项目中使用实体之间存在一对多@OneToMany,多对一@ManyToOne的映射关系,怎么设置呢? GitHub地址:https://github.com/AngelSXD/myagenorderd ...
- xamarin android 获取根证书代码
Java.Security.KeyStore keyStore = Java.Security.KeyStore.GetInstance("AndroidCAStore"); ke ...
- Android减少布局层次--有关Activity根视图DecorView的思考
1 Android应用图层 一直觉得有关DecorView还是有些问题没有搞清楚,今天在看了一点有关SurfaceFlinger的内容以后,顿时突发奇想,想到之前的问题,之前的思考是: 虽然可以将De ...
- Proftpd快速搭建FTP服务器
前言 在Linux系统中,FTP服务器软件有很多,都已经成熟,像vsftpd, wu-ftp, Pure-FTPd等.但这些软件安装配置起来都比较麻烦,搭建个人的FTP服务器,还是Proftpd比较简 ...
- Odoo10尝鲜: 采购协议
Odoo10 对 call for bid 进行了 改进, 作为 '采购协议' 进入 采购, 选择 'Purchase agreement' 在 agreement 列表 建立新的 协议 选择 协议类 ...
- 设置安卓开机动画、开机logo
我们要修改的是system>media文件夹下的bootanimation.zip(手机开机动画)这个文件 先来讲讲这个文件结构:该zip解压后得到两个文件, 第一个目录存放了开机时播放的图片( ...
- android相关文件夹的存取方式与函数解析---全
因为排版问题.转为markdown编辑: http://blog.csdn.net/self_study/article/details/58587412
- window 平台搭建简单的直播点播系统
Windows平台如何搭建简单的直播系统前文已经有介绍,今天介绍下如何搭建简单的点播系统. 同样还是利用crtmpServer,crtmpServer可以从github中下载,可以从群里下载(群里有修 ...
- C#除法精度
string.empty()NULL 首先要安装虚拟机工具VMWare Tool这样鼠标进出使用也方便. 1.虚拟机和主机之间在安装了VMWare Tool之后可以实现剪贴板的共享,即可以复制粘贴.但 ...