`
jeafyezheng
  • 浏览: 99536 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

bash编程学习笔记

阅读更多

bash编程学习笔记(1)<o:p></o:p>

  好象现在不流行用shell编写脚本了,这些笔记可能显得有些过时,放在这儿供自己参考吧。
  同时,尽可能把一些细节列出来,供大家当参考手册来查吧。<o:p></o:p>

  可以理解为用shell这种脚本语言进行编程,编写好的程序放在文件里,用bash 来解释执行这个程序。
  下面概要介绍一下shell编程。<o:p></o:p>

  编写shell脚本程序的要求:<o:p></o:p>

建立脚本<o:p></o:p>


  程序第一行需用#!指明解释程序
  通过bash filename来运行filename程序。chmod +x filename将程序改为可执行,则可用./filename运行此脚本。 <o:p></o:p>

  shell脚本语言作为一种编程语言,与其它计算机高级语言一样有一些共性:<o:p></o:p>

注释<o:p></o:p>


  以#开头的至行尾的信息(当#出现在引号内、正则式内、比较式内等不为注释符的情况除外) <o:p></o:p>

变量<o:p></o:p>


  变量名是字符串,赋值如下: 变量名=
  对变量的使用或取出变量值,在变量名前加$符号,有时为了将变量名与其它字符区别开来,可以用${变量名}的方式。对变量的值的引用,叫变量替换(variable substitution)。变量只有在声明、赋值、unsetexport或表示signal时,不用$作前缀。
  还有一类变量叫环境变量,与shell变量的用法一致,用export命令可以将shell变量改为环境变量,不清楚反向如何操作。
  变量声明后尚未赋值时,值为null.
  当$a为一含有空格的字符串时,echo $aecho “$a”的结果可能不一致,前者会压缩多余的连续空格。
  bash变量不分类型,当要对其进行四则运算时,只要求变量的值只含有阿拉伯数字。 <o:p></o:p>

命令<o:p></o:p>


  相当于一般语言里的基本函数,常用的shell命令参看附表。
  shell脚本语言可以自定义函数。 <o:p></o:p>

流程控制<o:p></o:p>


  1)if语句
  if [ ... ]; then
   ...
  elif [ ... ]; then
   ...
  else
   ...
  fi
  其中用” [ ] ”表示条件测试,注意方括号周围的空格。 <o:p></o:p>

  2)case语句
  case表达式可以用来匹配一个给定的字符串,而不是数字。
  case ... in
  ...) do something here ;;
  ...
  *) otherwise do something here;;
  esac<o:p></o:p>

  3)while语句
  while ...; do
   ....
  done
  4)for语句
  for var in ....; do
   ....
  done<o:p></o:p>

输入输出<o:p></o:p>


命令间交互
  1)管道(|)
  将一个命令的输出当作另一个命令的输入
  2)重定向(>>>)
  >:将一个命令的输出写到一个文件并覆盖旧的内容
  >>:将一个命令的输出追加到一个文件的尾部
  3)反引号(`)
  可以将以反引号括起来的命令的输出作为另一个命令的命令行参数 <o:p></o:p>

select表达式
  select var in ... ; do
   break
  done<o:p></o:p>

需要说明的是,此处用语句,只是为了表达语言的共性,对shell脚本来说应该叫表达式比较准确。
附表: <o:p></o:p>

常用命令表(不详细区分外部命令与built-in命令)<o:p></o:p>

<o:p> </o:p>

命令<o:p></o:p>

说明<o:p></o:p>

echo "some text"<o:p></o:p>

将文字内容打印在屏幕上<o:p></o:p>

ls<o:p></o:p>

文件列表<o:p></o:p>

wc –l file<o:p></o:p>

计算文件行数<o:p></o:p>

wc -w file<o:p></o:p>

计算文件中的单词数<o:p></o:p>

wc -c file<o:p></o:p>

计算文件中的字符数<o:p></o:p>

cp sourcefile destfile<o:p></o:p>

文件拷贝<o:p></o:p>

mv oldname newname <o:p></o:p>

重命名文件或移动文件<o:p></o:p>

rm file<o:p></o:p>

删除文件<o:p></o:p>

grep 'pattern' file<o:p></o:p>

在文件内搜索字符串比如:grep 'searchstring' file.txt<o:p></o:p>

cut -b colnum file<o:p></o:p>

指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令<o:p></o:p>

cat file.txt<o:p></o:p>

输出文件内容到标准输出设备(屏幕)上<o:p></o:p>

file somefile<o:p></o:p>

得到文件类型<o:p></o:p>

read var<o:p></o:p>

提示用户输入,并将输入赋值给变量<o:p></o:p>

sort file.txt<o:p></o:p>

file.txt文件中的行进行排序<o:p></o:p>

uniq<o:p></o:p>

删除文本文件中出现的行列比如: sort file.txt | uniq<o:p></o:p>

expr<o:p></o:p>

进行数学运算Example: add 2 and 3expr 2 "+" 3<o:p></o:p>

find<o:p></o:p>

搜索文件比如:根据文件名搜索find . -name filename -print<o:p></o:p>

tee<o:p></o:p>

将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile<o:p></o:p>

basename file<o:p></o:p>

返回不包含路径的文件名比如: basename /bin/tux将返回 tux<o:p></o:p>

dirname file<o:p></o:p>

返回文件所在路径比如:dirname /bin/tux将返回 /bin<o:p></o:p>

head file<o:p></o:p>

打印文本文件开头几行<o:p></o:p>

tail file <o:p></o:p>

打印文本文件末尾几行<o:p></o:p>

sed<o:p></o:p>

Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file<o:p></o:p>

awk<o:p></o:p>

awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, <st1:place w:st="on"><st1:city w:st="on">IndiaKerry Miller</st1:city>, <st1:country-region w:st="on">USA</st1:country-region></st1:place><o:p></o:p>


以下几篇笔记,会详细地介绍一些细节。 <o:p></o:p>

参考资料
shell
编程
http://oldsite.linuxaid.com.cn/developer/sublist.jsp?i=49<o:p></o:p>

bash编程学习笔记(2)<o:p></o:p>

  bash中的一些特殊字符,具有特定含义或特殊功能。同一字符,在不同的上下文环境中,含义可能不一致,这点一定要注意。<o:p></o:p>

特殊字符表<o:p></o:p>

<o:p> </o:p>

字符<o:p></o:p>

说明<o:p></o:p>

#<o:p></o:p>

注释符,从#至行尾都是注释。在引号、反引号及正则式、表达式中不是注释符。<o:p></o:p>

;<o:p></o:p>

命令分隔符,由此可将多个命令放在一行中。(if 语句的条件式后有;号)<o:p></o:p>

;;<o:p></o:p>

Case语句中一个选项的结束符。<o:p></o:p>

.<o:p></o:p>

1)相当于source命令<o:p></o:p>

<o:p> </o:p>

2)文件名的一部分,尤其是用在开头可隐藏文件。<o:p></o:p>

<o:p> </o:p>

3)一个.表示当前目录,一个..表示上一级目录。<o:p></o:p>

<o:p> </o:p>

4)在正则式中,表示非回车换行的一个字符。<o:p></o:p>

"<o:p></o:p>

部分引用,即有部分字符还需要解释出具体内容。<o:p></o:p>

'<o:p></o:p>

全部引用,引号内的字符不再进一步解释。<o:p></o:p>

,<o:p></o:p>

逗号操作符,连接一系列算术运算,但只返回最后一个的结果<o:p></o:p>

\<o:p></o:p>

转义符,<o:p></o:p>

/<o:p></o:p>

文件路径分隔符,或除号<o:p></o:p>

`<o:p></o:p>

命令执行符,将执行的输出结果放入一变量<o:p></o:p>

:<o:p></o:p>

空命令,不做任何操作,返回真值。也被用来分隔PATH变量值中的路径,或etc/passwd中的项<o:p></o:p>

!<o:p></o:p>

对一个检测或返回值取反<o:p></o:p>

*<o:p></o:p>

统配符,正则式中的限定符,算法操作的乘号,一个**是幂运算符。<o:p></o:p>

?<o:p></o:p>

测试符,统配符<o:p></o:p>

$<o:p></o:p>

变量值引用符,或正则式中的行结束<o:p></o:p>

${}<o:p></o:p>

变量替换符<o:p></o:p>

$*$@<o:p></o:p>

位置参数<o:p></o:p>

$?<o:p></o:p>

返回状态值变量<o:p></o:p>

$$<o:p></o:p>

进程ID变量<o:p></o:p>

()<o:p></o:p>

1)命令组,启动一个子shell,由此组中定义的变量不能被组后的脚本访问。<o:p></o:p>

<o:p> </o:p>

2)数组初始化。<o:p></o:p>

{xxx,yyy...}<o:p></o:p>

选项符,选项间不能有空格,除非有引号或已转义。<o:p></o:p>

{}<o:p></o:p>

代码块符,定义匿名函数,不启动子shell,变量值块后脚本可见,可把此代码作一个命令看,有输入输出并可重定向。<o:p></o:p>

{}\;<o:p></o:p>

路径名,用在find命令中,对;转义以防为shell解析为命令分隔符,此;用以结束-exec参数。<o:p></o:p>

[]<o:p></o:p>

检测符,表达在[]内。[shell内建的,不是对/usr/bin/test的引用<o:p></o:p>

<o:p> </o:p>

数组元素<o:p></o:p>

<o:p> </o:p>

字符范围<o:p></o:p>

[[]]<o:p></o:p>

检测符,<o:p></o:p>

(())<o:p></o:p>

扩展并计算整数表达式<o:p></o:p>

><<o:p></o:p>

重定向符,字符串或整数大于或小于符<o:p></o:p>

&><o:p></o:p>

stdoutstderr重定向到一个地方<o:p></o:p>

>&2<o:p></o:p>

stdout重定向到stderr<o:p></o:p>

>><o:p> </o:p>

结果追加到信件尾部<o:p></o:p>

<<<o:p> </o:p>

用在here document<o:p></o:p>

\>\<<o:p></o:p>

正则式的单词边界(\b?)<o:p></o:p>

|<o:p></o:p>

管道,将前者的stdout作后者的stdin的内容,以子进程的方式运行,不可用来修改变量<o:p></o:p>

>|<o:p></o:p>

强制重定向<o:p></o:p>

||<o:p></o:p>

逻辑或<o:p></o:p>

&&<o:p></o:p>

逻辑AND<o:p></o:p>

&<o:p></o:p>

后台运行<o:p></o:p>

-<o:p></o:p>

1)参数前缀<o:p></o:p>

<o:p> </o:p>

2)stdout/stdin重定向,此时不是shell的功能,而是相关程序的。<o:p></o:p>

<o:p> </o:p>

3)前一个工作目录,等$OLDPWD<o:p></o:p>

<o:p> </o:p>

4)减号<o:p></o:p>

=<o:p></o:p>

等号,或字串比较符<o:p></o:p>

+<o:p></o:p>

加号<o:p></o:p>

<o:p> </o:p>

有些程序用+打开用-关闭某些功能<o:p></o:p>

%<o:p></o:p>

模操作符,在正则式中做匹配符<o:p></o:p>

~<o:p></o:p>

初始目录,等于$HOME<o:p></o:p>

~+<o:p></o:p>

当前目录,等于$PWD<o:p></o:p>

~-<o:p></o:p>

前一工作目录,等于$OLDPWD<o:p></o:p>

^<o:p></o:p>

正则式中的行开始。<o:p></o:p>

bash编程学习笔记(3)<o:p></o:p>

  命令行参数的处理。<o:p></o:p>

  命令行参数,可以通过$0,$1,$2...变量引用,其中$0指脚本程序本身的名字,$1是第一个参数,依次类推。从第10个参数开始,对其引用时要加花括号,如${10}, ${11}等。
  命令行参数的个数可以通过$#变量取得,一下取得所有的参数可以通过变量$@$*取得,区别是前者不压缩变量之间的空白。见下列。 <o:p></o:p>

[hedong@linux bashlearning]$ bash params.sh 1 2 3 4 " 5" 6 7 8 9 10
$@ is 1 2 3 4  5 6 7 8 9 10
$* is 1 2 3 4 5 6 7 8 9 10 <o:p></o:p>

[hedong@linux bashlearning]$ bash params.sh 1 2 3 4 5 6 7 8 9 10
$@ is 1 2 3 4 5 6 7 8 9 10
$* is 1 2 3 4 5 6 7 8 9 10<o:p></o:p>


  直接对最后一个参数的引用,要通过间接引用的方式,如下: <o:p></o:p>

args=$# # Number of args passed.
lastarg=${!args} # Note that lastarg=${!$#} doesn't work.<o:p></o:p>


  判断一个参数存在或不存在,可分别用-n-z条件操作符,如: <o:p></o:p>

if [ -n $1 ]
then
echo "#1 parameter is $1"
else
echo "#1 parameter does not exist"
fi<o:p></o:p>


  运行一次shift命令,可以把参数的值依次往前传递一遍,即$1<-$2,$2<-$3,等等,同时将$#值减一。下面的命令与echo "$@"一样的效果。 <o:p></o:p>

until [ -z "$1" ] # Until all parameters used up...
do
echo -n "$1 "
shift
done<o:p></o:p>


附:常用的变量比较或条件判断操作表<o:p></o:p>

条件表达式<o:p></o:p>

解释<o:p></o:p>

-z string<o:p></o:p>

True,如果串长为0<o:p></o:p>

-n string<o:p></o:p>

True,如果串长不为0<o:p></o:p>

string1 OP string2<o:p></o:p>

Op可以是==, !=, <, >,字符串比较<o:p></o:p>

评论

相关推荐

    shell编程学习笔记

    变量: 变量的赋值和引用 在shell编程中变量没有类型,简称弱类型编程语言,不需要声明,在引用这个变量时会创建它(在变量名前加$符号引用变量的值)。在定义变量时,若String中包含空格、制表符、换行符,需用单...

    入门到熟练 高效 Bash Shell 学习笔记材料书籍 BashNotesForProfessionals

    一本特别实在的 Bash 笔记教程,学习效率很高。是一份不可多得的高效 Bash 学习材料。如果你想学习 Bash Shell、Bash 脚本编程,看它绝对没错。免费分享!不用积分,更不用付费! 或者从此处直接下载: ...

    BASH 学习笔记小结

    BASH 学习笔记小结,想要学习linux bash编程的朋友可以参考下

    bash获取当前路径示例

    您可能感兴趣的文章:bash shell命令行选项与修传入参数处理Bash Shell 注释多行的几种方法bash批量修改文件名称的方法小结(增加,去除,修改后缀)bash 编程中循环语句用法BASH 学习笔记小结Bash Shell字符串操作小...

    Linux shell 编程学习笔记

    这次难得有时间和条件来学习,所以做好笔记。 一:shell 能做什么  二:shell 脚本的几种执行方式,我们创建文件 start.sh,并且赋予 执行权限 chomd +x start.sh #然后可以通过以下命令执行 #相对路径,或者绝对...

    coding:编程技术学习笔记 https

    笔耕不缀,持续学习 网站 2021 2020 2019 vdom 原理解析与简单实现 从酷炫的果冻菜单谈起 CSS3 filter 属性 使用 js 实现依次执行异步任务 ...python 学习笔记 Too young, too simple. Sometimes, naive.

    Linux最佳入门-个人学习笔记-知识点总结.rar

    这是个人10年前的Linux Ubuntu学习笔记,之后查笔记时,都会补充新知识,也有纠错,涵盖了10个PDF文件,由有道笔记导出,非常适合初学者。这些PDF文件包含了丰富的知识和实用技巧,能够帮助您更好地掌握Linux Ubuntu...

    机器学习笔记

    第14天课程内容: 1、Linux内核编译(2):编译内核的步骤、重新编译 2、CentOS系统安装:创建工具、语法检查、安装过程如何获取kickstart文件 3、anaconda应用的工作过程、anaconda...5、bash脚本编程之while循环语句

    matlab图片频域分析代码-Learning:吴甜甜的编程语言学习资料与程序笔记资源

    :basketball:我的编程语言学习资料与程序笔记资源 吴甜甜 个人博客: wutiantian.github.io 目录 AI 人工智能基础学习资料 Android 安卓基础学习资料 ComputerVision 计算机视觉学习资料 Disadvantage 我的缺点 ...

    97 Things Every Programmer Should Know 等 24 本书

    AngularJS学习笔记(checkcheckzz).epub Everything curl.epub F# for Fun and Profit eBook.epub Gradle 实战.epub iOS的函数响应型编程.epub JVM必知必会.epub Kubernetes 指南.epub LeetBook(LeetCode详解)....

    古月居ROS入门21讲学习笔记(编程基础9-16课)(持续更新)

    第九课 创建工作空间课功能包 工作空间 src:代码空间。xml文件 build:编译空间,基本不用关心 devel:开发空间, install:安装空间 ...source devel/setup.bash 检查环境变量 echo $ROS_PACKAGE_PAT

    linux-notes:面向中国程序员Linux快速入门笔记本

    Linux命令行及bash相关的笔记坑挖好了, 开始填:)这是我的笔记梳理, 删掉旧版本, 重新梳理中.....doing当前进度: 20%基于系统: centos 6.5参考书目鸟哥Linux私房菜Linux与Unix Shell编程指南Linux Shell脚本攻略概要...

    Linux笔记.txt

    包括Linux原则、时间戳、Linux文件系统标准、bash的特性、passwd文件字段、变量类型等基本知识,且含有查看命令历史、命令替换、文件名通配、模式匹配、字符集、IO重定向、条件测试、常用命令集、正则表达式用法、...

    dotfiles:汤姆·劳伦斯(Tom Lawrence)分叉的一组bash点文件以及安装程序和卸载程序-Lawrence Systems

    大约25年前,当我在大学学习计算机时,我开始编程。 这是一个成熟项目的分支,该项目扩展了我的笔记本电脑和我希望安装在其上的任何其他计算机上的bash设置,如果时间允许,我将添加功能。 目前,我非常享受整个...

    欧拉公式求圆周率的matlab代码-vidyaratna:为新手提供精选资源,帮助他们开始编程,开源,网络安全以及更多领域

    易于开发:与其他OS相比,Linux总体而言编程和开发要好得多。 您可以自己做事情:使用Linux时需要学习很多东西,您可以了解有关OS的许多知识,并可以了解一切在后台运行的方式。 阅读有关Linux的更多信息 安装和双重...

    Linux_BashAwk_scripting_BootCamp_RSG_iGEM_Ecuador

    Linux和Bash / Awk脚本BootCamp 与计算生物学学生小组( )合作开发了理论实践讲习班: 作者: Juan Zurita, ,Camila Armas,DanielaSampértegui新兵训练营的描述和目的本新手训练营旨在学习基于UNIX的操作系统...

    learning_python:我的Python学习资料库

    Python是一种的通用编程语言。 我想学习Python很长时间了,但由于可以在Perl和R中完成所有工作而。但是,最近我一直在使用 ,它是一个基于Python的工作流管理系统,意识到知道Python可以帮助我更好地使用该工具。 ...

    leetcode下载-learning_go:我在学习去!

    记录学习golang出现的问题,感悟,笔记和总结。From 2017-10-17 go版本go version go1.9.1 darwin/amd64 编辑器使用VSCode 调试器使用 项目结构 : go语言基础 : go语言基础第二 : 一个排序的小工具(来自go语言编程一...

Global site tag (gtag.js) - Google Analytics