导读

关于shell编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念、命令与操作做一个简要的记录,以备方便查找。

(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行)


目录
  1. 终端、shell 和 bash
  2. 常用的基础命令
  3. Linux Shell 的变量
  4. 编程语法 与 文本处理
  5. 正则表达式
  6. 进程相关
1、终端、shell 和 bash

详细的区别与联系:点这里

一个最简单的 “Hello world” 显示 程序:

#! /bin/bash
echo "Hello world"

echo.sh

#!/bin/bash 的作用:说明是用哪一个shell 来解释文件,如果没写,默认使用 $SHELL 里设置的shell

#! 可以用来指定不同的命令解释器,比如我们指定 rm 程序, 以下是一个自删除脚本:

#!/bin/rm
# 自删除脚本
# 当你运行这个脚本时,基本上什么都不会发生...... 当然这个文件消失不见了
WHATEVER =
echo "This line will never print"
exit $WHATEVER #脚本不会执行上面这几句

#!/bin/rm

2、常用的基础命令

echo:显示一个字符串

pwd:打印当前工作目录

whereis: 查看与程序相关的路径

source: 在当前的环境下执行指定的脚本文件,其执行结果会影响当前环境,比如执行的脚本 中cd执行会影响当前工作目录

more 或 less : 以翻页的方式查看文件,less 相比与 more 多了一些功能上的特性

cat: (连接文件)将文件输出到标准输出

head | tail: 输出文件的头或尾的一部分

grep: 打印符合特定模式的行

> | : 重定向 和 管道

ls 显示当前目录下的文件(ll 等)

read: 从标准中读取一行

printf "Enter new password:"
stty-echo
read poss < /dev/tty
printf "Enter again"
read pass2 < /dev/tty
......

例子:/dev/tty 读取密码

文件和文件夹的基本操作:点这里

3、Linux Shell 的变量
普通变量:

例子:

 vname="content"
echo "$vname"
echo '$vname'

变量赋值:= 的两边不能有任何空格

变量援引:line 2 显示 “content” ;line 3 显示 “$vname”

数值变量运算:

let "var += 4"
var=$(($var + 4))
环境变量:

unset:从当前shell删除变量或函数

export:修改当前进程的环境变量

env:显示环境中的环境变量和对于的值

注意:env 和 set 函数不同。env函数显示的是环境变量,而set显示的是所有本地变量,包括用户的环境变量。

环境变量相关文件的设置:点这里

shell 脚本语法:(条件、循环等)  点这里

4、编程语法 与 文本处理

由于这两部分内容相对较多,为避免文章篇幅过大,这两部分分别在具体的文章里记录。

编程语法:点这里

文本处理:点这里

5、正则表达式
概要

正则表达式在UNIX/Linux 系统中有广泛的结合与应用,用来强化工具本身的功能。常见的 UNIX 下支持正则表达式的工具有:

  • 用于匹配文本行的 grep 工具族
  • 用于改变输入流的 sed 流编辑工具(steam editor)
  • 用于处理字符串的语言,如 awk 、python 、perl 、Tcl 等语言
  • 文件查看程序,或分页程序,如more ,page,less
  • 文本编辑器,如 ed,vi, emacs,vim 等

gerp 族有曾有三种版本:

grep 最早的文本匹配程序。使用 POSIX 支持的基本正则表达式 (Basic Regular Expression, BRE)

egrep 拓展的grep 。使用拓展正则表达式 (Extended Regular Expression,ERE)

fgrep 快速grep (fast/fixed grep)。这个版本用于匹配固定字符串而不是正则表达式

1992 年 POSIX标准 将其合而为一,只推荐使用grep,其他用参数来支持。

基础

正则表达式中有两种基本字符匹配,特殊字符(meta Character , 元字符)和一般字符。

POSIX BRE 和 ERE 都支持的meta字符:

^    锚定行或字符串的开始。BRE仅在正则表达式的结尾处有意义,ERE在正表达式的任何地方都

     有特殊意义(.*^word  在ERE有效,但是意义?)

$    锚定行或字符串的结尾。在BRE 与 ERE的区别同上

.     匹配一个非换行符的字符。

*      匹配先前字符任意多个,包括0

[...]   方括号表达式(Bracket Expression ),匹配方括号里任意一个字符 [^A-FH-Z] 表示匹

     配大写字母G和其他除大写字母外的字符/

\     用于打开或关闭后续字符的特殊含义。如 \(\)

POSIX BRE 和ERE 支持不同的meta字符

仅 BRE:

\(\)     \(\)两个符号之间的模式被储存在保留空间(Holding Space),在后续通过转义引用,最多储

       存9个。\(a\).*\1 表示2个a中间有任意字符的串。

\n      与上面的\(\)结合使用,n为1~9

x\{m,n\}  x表示模式,表示x出现m~n次,x\{n\}  表示出现n次,x\{m,\} 表示出现至少m次

仅 ERE:

x{m,n}  同上一条

+     相比* , 不包括0

?      匹配0个或1个

|      匹配前面 “或” 后面的正则表达式

()      匹配使用括号括起来的正则表达式群,如 (a.*a)|(b.*b) 表示匹配2个a中间有任意字符的串 或 2个b的情况。

GNU 版本 的grep 支持额外的 meta字符:

\<    锚定单词的开始(不仅仅是行的开始)

\>    锚定单词的结束

\w    匹配文字和数字字符,等价于 [A-Za-z0-9]

\W    \w 的反义

\b    锁定单词,如“\bgrep\b”只匹配前后有空格或行开始与行结束的串

为了在不同国家的字符编码中保持一致,POSIX (The Portable Operating System Interface)增加了特殊的字符类:

[:alnum:]  A-Za-z0-9

[:alpha:]  文字字符

[:blank:]  space 和 tab

[:digit:]   数字

[:graph:]  非空字符(非空格、控制字符)

[:lower:]  小写字符

[:cntrl:]   控制字符

[:print:]    可打印字符,非空字符(包括空格)

[:punct:]  标点符号

[:space:]   space  和tab 和 换行符

[:upper:]  大写字符

[:xdigit:]   十六进制数 (0-9,a-f ,A-F)

这样就可以使用[:alpha:]匹配中文了;上面字符使用的时候必须置于[] 中才能成为正则表达式。

比如匹配数字字母下划线: grep -E "[[:digit:][:alpha:]_]+"

6、进程相关

ps: 显示当前进程的快照 (常用参数 aux 或 -elf )

pstree: 打印进程结构

top : 显示系统的进程

后台方式启动程序:command &

jobs: 查看当前会话的作业状态 (-l 参附加地显示任务的进程号)

Ctrl-Z: 可以使前台任务挂起暂停执行

bg:   (将当前作业带入后台) 对于后台挂起暂停的进程,转到后台继续执行; 使用 %jobID 参数可以指定具体的进程

fg:  将后台进程 (由+号指定) 置于前台

stty tostop : 如果后台具有终端输出。该命令强制停止该作业

kill -l : 列出所有进程调度信号

nice:  以指定的优先级启动一个程序

crontab 和 at :调度例程或单个(一次)系统任务。

产生信号的方式:

1) 终端按键:Ctrl+C: SIGINT       Ctrl+Z:SIGSTOP          Ctrl+\:SIGQUIT

2) 通过系统调用:kill -SIGTERM 45624  |  kill -9 4546

3) 通过函数(软件):kill(SIGTERM,456465);

linux —— shell 编程(整体框架与基础笔记)的更多相关文章

  1. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  2. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  3. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  4. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  5. 前端学习 linux —— shell 编程

    前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...

  6. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  7. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  8. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  9. linux系统编程之框架

    linux系统编程之框架: 1. 进程 1.1 进程概念 1.1.1 PCB 1.1.2 环境变量 1.2 进程控制 1.3 进程间通信 1.3.1 管道 1.3.2 有名管道 1.3.3 共享内存 ...

随机推荐

  1. C# 泛型2

    我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类 ...

  2. Android JIN返回结构体

    一.对应类型符号 Java 类型     符号 boolean     Z byte     B char     C short     S int     I long     J float   ...

  3. Ubuntu 12.04 下安装配置 JDK 7(tar)

    第一步:下载jdk-7u45-linux-i586.tar.gz 到Orcale的JDK官网下载JDK7的tar包 第二步:解压安装 tar -zxvf ./jdk-7u45-linux-i586.t ...

  4. Android单元测试初探——Instrumentation(转载)

    学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次.这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以 ...

  5. 基于cx_freeze编译PyQt4程序(numpy & scipy)

    当开发完成PyQt4程序后,需要提供给他人使用,这时最好的办法是将Python程序编译成exe文件. 通常我采用cx_freeze完成这个工作,即编写setup.py文件,执行python setup ...

  6. python自动开发之第十三天

    1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...

  7. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  8. bootstrap js插件

    导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScri ...

  9. 简述MVC思想 与PHP如何实现MVC

    我相信已经有很多这样的文章了,但是我今天还是愿意把自己的经验与大家分享一下.纯属原创,我也没什么保留,希望对新手有帮助,有说的不对的地方,也欢迎指出. 什么是MVC? 简单的说就是将网站源码分类.分层 ...

  10. 解决maven仓库有jar包但是maven程序无法下载仓库jar包

    话说,这个问题困扰了我两个多月了已经~~~ 后来发现不知道被谁动了,把我的仓库没有放到仓库组里面~~~ 用admin登录进去,默认密码是admin123,然后看截图操作吧. (记得删除你本地报错说** ...