[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脚本文件格式,

 1 #!/bin/bash
 2
 3 function1()
 4 {
 5 }
 6
 7 function2()
 8 {
 9 }
10
11 # 主程序
12 echo “hello world” # 打印hello world
13 ...
14 ...
15 ...

Bash中以$开头的变量,


$#


传递给脚本的参数个数


$*


传递给脚本的所有参数的值


[email protected]


同$*


$$


脚本的进程号


$!


后台运行的最后一个进程的进程号


$-


显示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命令,等待所有子进程结束


……


……


待今后继续补充

时间: 2024-10-26 18:30:42

[shell] Bash编程总结的相关文章

Shell(BASH) 编程

SHELL PROGRAMMING 目录: 1.shell简单介绍 2.shell 编程准备 3.shell编程结构化语言构建 4.其他 5.shell编程的两个示例 写在前面: 1.Hello World #!/bin/bash # This is an example of bash HelloWorld # You can start shell programming with an Hello World example echo 'Hello World' 2.计算1+1=2 #!/

8.11_Linux之bash shell脚本编程入门篇(一)

什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell.至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件).不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好:组合目的的单一的小程序完成复杂的任务.我觉得shell脚本编程就很好的体现了这个哲学思想.shell脚本利用shell的功能缩写的一个"程序&quo

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

Bash Shell脚本编程笔记总结(二)

本文接上一部分:Bash Shell脚本编程笔记总结(一) 数组: 连续的多个独立内存空间,每个内存空间相当于一个变量 数组元素:数组名+索引 索引:从0开始编号 声明数组: declare -a ARRAR_NAME 关联数组: declare -A ARRAY_NAME 支持稀疏格式: 数组元素的赋值: (1) 一次只赋值一个元素 ARRAY[index]=VALUE a[0]="hello" (2) 一次赋值全部元素 ARRAY=("mon" "tu

bash配置与shell脚本编程

写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How. 本篇主要内容: ● bash特征之多命令执行 ● 逻辑运算(与或非) ● 编程语言简介 ● shell脚本格式与特点 ● bash配置,定制bash工作特征 ● 扩展 intall mktemp 本篇涉及配置文件: ◎ /etc/profile ◎ /etc/profile.d/*.sh ◎ /etc/bashrc ◎ ~/.bash_profile ◎ ~/.bashrc ◎ ~/.bash_log

8.15_Linux之bash shell脚本编程入门篇(二)以及文件查找和压缩的使用

bash shell脚本编程入门篇(二) read命令的使用 作用: 使用read来把输入值分配给一个或多个shell变量: -p指定要显示的提示 -t TIMEOUT read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量 EX.read -p "Enter a filename:" FILE 条件选择之if的使用 if的作用:选择执行(注意:if语句可嵌套) 单分支 if 判断条件;then 条件为真的分支代码 fi EX.单分支案例 双分支 if

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?

Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多.如:[ip]命令可以配置IP地址.路由条目的配置管理操作非常完善,该命令就可以完成[ifconfig]和[route]命令实现的所有功能.函数是单独的功能模块,如果函数能够接收选项参数,那么该函数的功能就变得丰富,且灵活.脚本也是一样. 那么linux中命令的格式又是怎么样的呢? [[email protected] ~]# command   [optons parameter1 | parameter2]...  pa

bash shell脚本编程学习总结

shell脚本编程 编译器-------解释器 静态语言:编译型语言,强类型(变量):事先转换成可执行格式.C/C++/JAVA/C# 动态语言:解释型语言,弱类型.边解释变执行.PHP,SHELL,python,perl 面向过程:shell,c:面向对象:java,python,perl,c++ 变量赋值:VAR_NAME = VALUE: bash变量类型: 环境变量:作用域为当前shell进程及其子进程. export VARNAME=VALUE或者 VARNAME=VALUE expo