[shell] Bash编程总结
2015-05-30 17:42
239 查看
由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试、打包、安装包等。虽然相比C++编程,要简单、傻瓜,但其在类Unix系统中可以大大提高工作的效率。所以在此对脚本编程过程中一些注意事项进行简单的总结。
用户通过向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』。
Bash中以$开头的变量,
字符串操作,
文件状态的测试,
数值测试,
字符串测试,
逻辑运算符,
[b]1. shell概述[/b]
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』。
[b]2. Bash编程[/b]
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 | 逻辑或 |
[b]3. 脚本调试[/b]
sh -x a.sh | 跟踪脚本的执行,对脚本中每条命令先执行替换,然后显示,再执行 |
sh -v a.sh | 按输入的原样打印脚本中的每行,打印一行执行一行 |
sh -n a.sh | 对脚本进行语法检查,但不执行 |
[b]4. 一些技巧[/b]
屏蔽命令打印 | 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 <<EOF
- linux学习笔记—shell脚本执行方式
- HBASE Shell
- PowerShell中进行文件读取,信息排序,分类计数。
- linux学习笔记—shell概述
- KalilMetasploit生成cmdshell(未免杀)
- Linux&nbsp;Shell常用技巧(目录)
- shell脚本学习
- tlcl-从shell眼中看世界echo
- Bash中的特殊字符
- Linux Bash编程
- [LeetCode][Shell]Tenth Line
- Linux Shell脚本攻略(1.7)
- BASH
- win7(windows) 下 git bash 调用 notepad++ 或者其他编辑器的方法
- shell
- (转)xshell无法在vim中复制黏贴
- Windows Shell 程序
- PowerShell Azure 常用命令
- Shell 基本命令