bash特性及bash脚本编程初步
终端,附着在终端的接口程序;
GUI: KDE,GNome,Xfce
CLI: /etc/shells bash的特性:
命令行展开: ~,{}
命令别名: alias,unalias
命令历史: history
文件名通配: glob
快捷键:ctrl + a ,e,u,k,l
命令补全:$PATH
路径补全: bash特性之: 命令hash
缓存此前命令的查找结果: key-value
key : 搜索键
value : 值
hash命令 :
hash: 列出
hash -d cmd: 删除
hash -r : 清空 bash的特性之一: 变量
程序: 指令+数据
指令:由程序文件提供;
数据:IO设备,文件,管道,变量
程序: 算法+数据
变量名+指向的内存空间
变量赋值: name=value
变量类型: 存储格式,表示数据范围,参与的运算
编程语言:
强类型变量:
弱类型变量:bash把所有变量统统视为字符型;bash中的变量无需事先声明;
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
变量引用:${var_name},$var_name
变量名:包含字母,数字和下划线(开头不能是数字)
变量名:见名知义,命令机制遵循某种法则,以便区分,理解;不能使用程序的保留字,例如:if,else,while等 bash变量类型:
本地变量:作用域仅为当前shell进程
环境变量:作用域为当前shell进程及其子进程
局部变量:作用域仅为某代码片段(函数上下文) 位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
$?:
0:成功
1-255: 失败 本地变量:
变量赋值:name=value
变量引用:${name},$name
"":变量名会替换为其值;
'':变量名不会替换为其值;
查看变量:set
撤销变量:unset name
注意:此处非变量引用;
环境变量:
变量赋值:
(1) export name=value
(2) name=value
export name
(3) delcare -x name=value
(4) name=value
declare -x name
变量引用:${name},$name 注意: bash内嵌了许多环境变量(通常为全大写字符),用于定义bash工作环境
PATH,HISTSIZE,HISTFILE,SHELL,HOME,UID,PWD...
查看环境变量:export,declare -x,env,printenv
撤销环境变量:unset name 只读变量:
(1) declare -r name
(2) readonly name 只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程进程终止而终止; bash特性之一多命令执行:
# cmd1 ; cmd2 ; cmd3 ; ... 逻辑运算:
运算数: 真(true,yes,on,1)
假(false,no,off,0)
与:
1 && 0 = 0
或:
1 || 0 = 1
非:
! 1 = 0
异或:判断是否相同,相同为0,相异为1; 短路法则:
示例:# id $username || useradd $username shell脚本编程:
编程语言分类:根据运行方式
编译运行:源代码-->编译器(编译)-->程序文件 解释运行:源代码-->运行时启动解释器,由解释器边解释边运行;
根据其编程中功能的实现是调用库还是调用外部的程序文件;
shell脚本编程:
利用系统上的命令及编程组件进行编程;
完整编程:
利用库或编程组件进行编程; 编程模型:过程式编程语言,面向对象的编程语言
过程式:以指令为中心来组织代码,数据服务于代码;
顺序执行
选择执行
循环执行
如:c,bash
对象式:以数据为中心来组织代码,围绕数据来组织指令;
类(class): 实例化对象,method;
如:Java,c++,Python shell脚本编程:过程式编程,解释运行,依赖外部程序文件运行
如何写shell脚本:
脚本文件的第一行,定格:给出shebang,解释器路径,用于指明解释器当前脚本的解释器程序文件
常见的解释器:
#!/bin/bash
#!/usr/bin/python 文本编辑器:nano
行编辑器:sed
全屏编辑器:nano,vi,vim shell脚本是什么?
命令的堆积;
但很多命令不具幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误;
运行脚本:
(1)赋予执行权限,并直接运行行命令参数传递给解释器程序;
chmod +x /PATH
/PATH
(2) 直接运行解释器,将脚本以命令行参数传递给解释器程序;
bash /PATH 注意: 脚本中的空白行会被解释器忽略;
脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行被忽略;
shell脚本的运行是通过运行一个子shell进程实现的; 练习:写脚本
(1) 显示/etc目录下所有以大写p或小写p开头的文件或目录本身;
(2) 显示/var 目录下的所有文件或目录本身,并将显示结果中的小写转换为大写后显示;
(3) 创建临时文件/tmp/myfile.xxxx; bash的配置文件:
两类:
profile类:为交互式登录的shell进程提供配置
bashrc类:为非交互式登录的shell进程配置
登录类型:
交互式登录shell进程:
直接通过某终端输入账号和密码后登录打开的shell进程;
使用su - username 或者 su -l username执行的登录切换;
非交互式登录shell进程:
su username执行的登录切换;
图形界面下打开的终端;
运行脚本
profile类:
全局:对所有用户都有效;
/etc/profile
/etc/profile.d/*.sh
用户个人:仅对当前用户有效;
~/.bash_profile
功用:
1.用于定义环境变量;
2.用于运行命令和脚本;
bashrc类:
全局:
/etc/bashrc
用户个人:
~/.bashrc
功用:
1.定义本地变量;
2.定义命令别名;
注意:仅管理员可修改全局配置文件; 交互式登录shell进程:
/etc/profile-->/etc/profile.d/*-->/.bash_profile-->~/.bashrc-->/etc/bashrc 非交互式登录shell进程:
~/.bash rc-->/etc/bashrc-->/etc/profile.d/* 命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期
配置文件定义的特性,只对随后新启动的shell进程有效 让通过配置文件定义的特性立即生效:
(1) 通过命令行重复定义一次;
(2) 让shell进程重新读配置文件;
~]# source /PATH
~]# . /PATH 问题一:定义对所有用户生效的命令别名,例如 cls='clear'?
问题二:让centos用户登录是,提供其已经登录,并显示当前系统时间?
bash脚本编程运算:
+,-,*,/,**,% 算术运算表达式:
(1)let VAR=算术运算表达式
(2)VAR=$[算术运算表达式]
(3)VAR=$((算术运算表达式))
(4)VAR=$(exor $arg1 $op $arg2)
如:
[root@localhost ~]# n1=3
[root@localhost ~]# n2=3
[root@localhost ~]# echo "$n1+$n2"
3+3
[root@localhost ~]# echo "$((n1+$n2))"
6
[root@localhost ~]# echo "$[n1+$n2]"
6
[root@localhost ~]# echo "$(expr $n1 + $n2)"
6 注意:乘法符号在有些场景中需要使用转义符; 练习:
写一个脚本,完成如下功能;
添加三个用户;
求此三个用户的UID之和;
  1 bash的基础特性:
2 globbing:文件名通配(整体文件名匹配,而非部分);
3 匹配模式:元字符
4 *:匹配任意长度的任意字符.例如:pa*,*pa,*pa*,*p*a*
5 ?:匹配任意单个字符.例如:pa?,??pa,p?a,p?a?,
6 []:匹配指定范围内的单个字符.
7 [a-z],[A-Z],[0-9],[a-z0-9]
8 [[:upper:]]:所有大写字母
9 [[:lower:]]:所有小写字母
10 [[:alpha:]]:所有写字母
11 [[:digit:]]:所有数字
12 [[:alnum:]]:所有字母和数字
13 [[:space:]]:所有空白字符
14 [[:punct:]]:所有标点符号
15 例如:pa[0-9][0-9],2[0-9][0-9],[abcd]....
16 [^]:匹配指定范围外的任意单个字符
17 [^[:upper:]]
18 [^0-9]
19 [^[:alnum:]]
20
21 IO重定向及管道
22 程序:数据+指令
23 输入数据流:<--标准输入(stdin),键盘;
24 输出数据流:-->标准输出(stdout),键盘;
25 错误输出: -->错误输出(stderr),显示器;
26
27 fd:file description,文件描述符
28 标准输入:0
29 标准输出:1
30 错误输出:2
31
32 IO重定向:
33 输出重定向: >
34 特性: 覆盖输出
35 输出重定向:>>
36 特性:追加输出
37
38 # set -C
39 禁止覆盖输出重定向至已存在文件;
40 此时可使用强制覆盖输出:>
41 # set +C
42 关闭上述特性
43
44 错误输出流重定向: 2> , 2>>
45
46 合并正常输出流和错误输出流:
47 (1) &> ,&>>
48 (2) cmd > /PATH 2>&1
49 cmd >> /PATH 2>&1
50
51 输入重定向: <
52
53 tr命令:
54 tr [option] ... set1 [set2]
55 把输入的数据当中的字符,凡是在set1定义范围内出现的,通过对位转换为set2出现的字符
56 用法1: tr set1 set2 < /PATH
57 用法2: tr -d set1 < /PATH (不输出set1范围字符)
58 注意:不修改原文件
59
60 here document: <<
61
62 cat << EOF
63 cat > /PATH << EOF
64
65 管道|:连接程序,实现将前一个命令的输出直接定向后一个程序当做输入数据流
66 cmd | cmd | cmd |...
67
68 tee命令: (从标准输入读入,输出并写入文件)
69 cmd | tee /PATH
70

  

  

shell脚本编程及bash特性的更多相关文章

  1. linux命令行与shell脚本编程大全---bash shell命令

    PS1 =“[\t][\u]\$”                  //新的shell提示符显示了当前时间和用户名 在Windows中,你经常看到这样的文件路径:D:\work\FTL moniqi ...

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

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

  3. Shell脚本编程总结及速查手册

    Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...

  4. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  5. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

  6. Shell脚本编程与文件系统修复

    导读 Linux基金会发起了LFCS认证(Linux 基金会认证系统管理员)Linux Foundation Certified Sysadmin,这是一个全新的认证体系,旨在让世界各地的人能够参与到 ...

  7. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

  8. 【读书笔记】Linux命令行与Shell脚本编程大全

    Linux命令行与Shell脚本编程大全 5.2 shell 的父子关系 命令分组 Command Grouping 主要有两种形式: 一种以小括号包括,命令之间以冒号分隔.也被称为 进程列表: 注意 ...

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

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

随机推荐

  1. string 和 vector 初探

    标准库类型 string string 表示可变长的字符序列.是C++标准库类型的一部分,拥有很多优秀的性能. 定义 string 对象时如未人为初始化编译器会默认初始化为空字符串. string 对 ...

  2. NSDate时间类/NSDateFormatter日期格式类

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // NSDate 时间类 继承自N ...

  3. Android 下使用opencv

    两种方式: 1.java API 2.Native/C++ 方式,OpenCV.mk中默认使用动态库的方式链接opencv,设置OPENCV_LIB_TYPE:=STATIC 以静态库方式调用 htt ...

  4. 加密学教程(Cryptography Tuturials)文件夹

    加密学教程(Cryptography Tuturials) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&quo ...

  5. springboot + rabbitmq 整合示例

    几个概念说明:Broker:简单来说就是消息队列服务器实体.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.Queue:消息队列载体,每个消息都会被投入到一个或多个队列.Bindi ...

  6. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(二)

    GPM怎样控制菜单权限以及菜单的增删显示 因为CCOA中仅仅有属于admin才干够进行权限管理与流程设计.password为pub. 1.加入CCOA功能菜单 进入GPM后,找到编号为CCOA的信息后 ...

  7. oc40--类的启动过程

    // // main.m // 类的启动过程 #import <Foundation/Foundation.h> #import "Person.h" #import ...

  8. 基于Spark的网站日志分析

    本文只展示核心代码,完整代码见文末链接. Web Log Analysis 提取需要的log信息,包括time, traffic, ip, web address 进一步解析第一步获得的log信息,如 ...

  9. Asteroids(匈牙利算法)

    求最小点覆盖数,即最大匹配数,匈牙利算法. #include<stdio.h> #include<string.h> ][],vis[],linker[];//linker[] ...

  10. css3 选择器 权重问题 (第二部分)

    这篇博文有关css的权重问题,我个人认为这是css知识中很重要的一个知识点.因为在开发的过程能中我们会经常遇到这种问题,特别是如果你使用框架的时候,有些框架的某些标签有一些默认的样式.所以我们可以通过 ...