由于工作需要,之前的几个月写了一些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编程总结的更多相关文章

  1. 08 bash特性--shell脚本编程入门

    shell脚本编程入门 编程语言介绍 编程语言分为:机械语言.汇编语言和高级语言: 计算机能识别的语言为机械语言,而人类能学习的并且能够方便掌握的为高级语言,所以,我们所编写的程序就要通过编译来转换成 ...

  2. shell脚本编程及bash特性

    bash特性及bash脚本编程初步 终端,附着在终端的接口程序; GUI: KDE,GNome,Xfce CLI: /etc/shells bash的特性: 命令行展开: ~,{} 命令别名: ali ...

  3. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

  4. Linux编程环境介绍(2) -- shell(Bash) 介绍

    1. 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe. 2. bash (Bourne Aga ...

  5. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

随机推荐

  1. react native ios启动指定模拟器

    react-native run-ios --simulator "iPhone 7 Plus” xcrun instruments -w 'iPhone X'

  2. 蚂蚁金服CTO程立:金融级分布式交易的技术路径

    总结: 强一致的微服务 oceanbase里面的投票选举以及多中心多地部署 单元化市异地多活的基础.支付宝是异地多活和容灾结合,而容灾的基础也是单元化.基于单元化进行单元的调度.部署.容灾. 混合云架 ...

  3. Java原子类及内部原理

    一.引入 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++: 这个操作实际是a = a + ...

  4. UITableView 滚动时使用reloaddata出现 crash'-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (0)' Crash

    例子: - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)in ...

  5. 邁向IT專家成功之路的三十則鐵律 鐵律二十三:IT人的成家之道-樸實

    根據內政部一份2013年最新的調查報告指出台灣人的離婚率位居全球第三,想想看如果這是經濟成長率的排名表現那該有多好.然而究竟為何在台灣這塊小小的土地上,不僅離婚非常高而且晚婚的人也非常的多,其原因肯定 ...

  6. 【jar】JDK将单个的java文件打包为jar包,并引用到项目中使用【MD5加密】

    ==================================================================================================== ...

  7. mac 当前位置打开终端

    做开发时经常会遇到在当前目录打开终端的情况,一直都是先启动终端,然后再切换到当前目录,今天发现了一个新的方法,虽然不是一步到位,但比以前快多了.   工具/原料   mac系统 苹果电脑 方法/步骤 ...

  8. iOS7系统中的坑——UITableViewCellScrollView

    今天开完一系列例会后,终于迎来放假的时候了,本来中午就要下班走的,想着火车票现在还很早,也就不急着走,闲着无聊,想着之前要写的内容,索性写一篇聊以打发时光,也希望对其他人有所帮助吧. 现在iOS的最新 ...

  9. navicat小经验和快捷键

    1.有时按快捷键Ctrl+F搜某条数据的时候搜不到,但是能用sql查出来,这是怎么回事? Ctrl+F只能搜本页数据,不在本页的数据搜不到,navicat每页只显示1000条数据.在数据多的时候nav ...

  10. 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)

    近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...