1. 基本知识

(1) $HOME: 当前用户的家目录

(2) `pwd`或$PWD:当前目录

(3) 脚本命名避免使用test,通过type -a test,可以查看所有匹配test的命令

gas@docker86-:~$ type test
test is a shell builtin
gas@docker86-:~$ type -a test
test is a shell builtin
test is /usr/bin/test

(4)  脚本中应包含作者、时间、命令描述等信息。脚本第一行必须以"#!"开头,告诉系统将使用哪个编译器执行该脚本。

#!/bin/bash
#: Title : hw
#: Date : --
#: Author : "ws"<ws@qq.com>
#: Version : 1.0
#: Description : print Hello, World!
#: Options : None printf "%s\n" "Hello, World!"

2. 输入、输出和吞吐量

(1) 命令行中的参数可作为标记参数,如第一个参数$1,第二个参数$2等

例:扩展hw脚本,打印第一个参数内容

#!/bin/bash
#: Title : hello
#: Date : --
#: Author : "ws"<ws@qq.com>
#: Version : 1.0
#: Description : print Hello and the first command-line argument
#: Options : None printf "Hello, %s\n" "$1"

例:如果脚本中增加shift命令,表示标记参数进行移位,shift的值默认值为1,也可以通过shift N进行设置

#!/bin/bash
#: Title : hello
#: Date : --
#: Author : "ws"<ws@qq.com>
#: Version : 1.0
#: Description : print Hello and the first command-line argument
#: Options : None shift
printf "Hello, %s\n" "$1"

运行: hello 1 2 3 4,结果为:Hello, 4,即当执行了shift 3后,第四个参数将会变为原来的第一个参数。

注意:shift命令执行后不可逆转,被忽略的参数无法被再次检索。

(2) 特殊参数

1) $#表示标记参数的个数

2) $@表示所有的标记参数

3) $0表示脚本名称

4) $$表示当前进程的pid

5) $?表示最后一行执行命令的返回码

6) $_表示最后一个参数

(3) echo少使用,多使用printf

echo -e参数可以识别转义字符,echo -n参数不识别转义字符。

printf表示按指定格式打印数据。格式为:printf FORMAT ARG ...。FORMAT可以包含普通字符,转义序列和特殊格式。

转义序列包含:

转义序列 说明
\a 警报
\b 回退
\e 转义字符
\f 跳页
\n 换行符
\r 回车
\t 水平tab
\v 垂直tab
\\ 反斜线
\nnn 八进制字符
\xHH 十六进制字符

例:

printf "Q\t\141\n\x42\n"
Q a
B

例:当参数多于说明符时,格式字符串将被重用,直到所有参数都被使用。

$ printf "%s\n" Print arguments on "separate\tlines" # %s不会进行转义
Print
arguments
on
separate\tlines
$ printf "%b\n" Print arguments on "separate\tlines" # %b会进行转义
Print
arguments
on
separate lines
$ printf "%d\n" 56.78 0xff # %d表示整型 -su: printf: 56.78: invalid number # 当不符合整型时,会报异常 $ printf "%f\n" 12.34 56.789 1.2345678 # %f表示浮点型,默认保留6位小数
12.340000
23.000000
56.789000
1.234568
$ printf "%e\n" 12.34 56.789 123.45678 # 科学计数法显示
1.234000e+01
2.300000e+01
5.678900e+01
1.234568e+02
$ printf "color: #%02x%02x%02x;\n" # 十六进制
color: #4169e1;

例:按指定宽度展示

$ printf "%8s %-15s:\n" first second third fourth fifth sixth # %8s表示在字符前有8个空格,%-15s表示在字符串后有15个空格
first second :
third fourth :
fifth sixth :
$ printf "%04d\n" # %04d表示当4位数不够时,以0开头补齐4位 $ printf "%12.4s %8.2f\n" John Jackson 4.579 Walter 2.9 # %.2f表示精确到2位浮点数
John 2.00
Jack 4.58
Walt 2.90

例:打印到变量中

$ printf -v num4 "%04d"
$ printf "%s\n" "$num4"

(4) stdin, stdout, stderror

$ printf "%s\n%v\n" OK? Oops! > FILE > ERRORFILE; # 标准输出 ">"重定向到 FILE,错误输出"2>"重定向到ERRORFILE
$ printf "%s\n%v\n" OK? Oops! > /dev/null # 标准错误输出到 /dev/null
OK?
$ printf "%s\n%v\n" OK? Oops! > FILE >& # 将标准输出和错误输出重定向到同一个文件
$ printf "%s\n%v\n" OK? Oops! >& > FILE # 注意顺序很重要
-su: printf: `v': invalid format character
$ printf "%s\n%v\n" OK? Oops! &> FILE # bash提供了将标准输出和标准错误输出到相同位置的方法 => &>

将exec 1>tempfile, exec 0<datafile, exec 2>errorfile写入脚本开始位置,则运行脚本时所有的标准输出都会写入tempfile,输入将从datafile中读取,错误异常都会写入errorfile中。

#!/bin/bash

exec >tempfile
exec <datafile
exec >errorfile printf "Hello, $1"
abc test

(5) read命令

用于读取标准输入。读取多个变量时,第一个值赋值给第一个变量,第二个值赋给第二个变量,若有剩余的值将全部赋值给最后一个变量。

$ read a b c d
Jan Feb Mat Apr May June Jul Aug
$ echo $a
Jan
$ echo $b
Feb
$ echo $c
Mat
$ echo $d
Apr May June Jul Aug read var < FILENAME # 文件输入作为读取的变量

(6) Pipeline管道

tee命令用于读取标准输入,并写入一个或多个文件中,以及标准输出中。$RANDOM是bash自带变量

$ printf "%s\n" "$RANDOM" "$RANDOM" | tee FILENAME
$ cat FILENAME

(7) 命令替换

常见两种格式:date=`date`; date=$( date )。需要注意针对外部命令有效,使用内置命令执行时将会较慢。

Bash编程(1) 基础的更多相关文章

  1. bash编程-Shell基础

    1. Shell脚本执行方式 直接运行,需要在脚本文件头部指定解释器,如#!/bin/bash ./myshell.sh 运行时指定shell解释器 bash myshell.sh 2. Shell命 ...

  2. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  3. 怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...

  4. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  5. 现代3D图形编程学习-基础简介(1) (译)

    本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...

  6. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  7. DOM0编程与基础方法

    ## 这里记录一下DOM编程的基础与方法----### DOM 的O:对象 objectO表示Object,对象的意思.JavaScript中对象可以分为三种类型1. 用户定义对象(user-defi ...

  8. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  9. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

随机推荐

  1. java外观模式

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  2. 一个简单的C#+arcgis的非数据库版例子

    1.首先新建一个winform的项目. 2.确保C#工具箱包含ESRI的相关控件,如果没有就需要安装SDK. 如果VS中依旧不存在esri控件解决方案如下,以VS2013为例: (1)打开注册表,定位 ...

  3. 工作中的Buff加成-结构化思考力:第一章:认识结构化思维及其作用

    一:引言 为了更好的说明结构思考力,我们先来做几个小测试. PS:如果你能做到,请留言,因为我要和你交好友,因为你是人才啊,可以挖一挖,挖到我的公司中. 第一个测试:请在三秒内记住下列数字.数字顺序不 ...

  4. 安装npm及cnpm

    一.安装npm 1. 使用npm首先需要下载node.js 进入nodejs官网nodejs下载,如下图 : 选择适合自己的系统,我这里使用的是window10 64bit 2. 开始安装 **选好需 ...

  5. jquery中animate({left:'-='+width})中的 '-='+是什么意思?

    left:'-='+width的意思是:left属性的最终值,是left现有值减去width这个值 例如:left:'200px' 意思是left最终值变成200left:'+200px' 意思与上面 ...

  6. kvm虚拟机扩展磁盘空间

    kvm虚拟机磁盘空间扩展与xen虚拟机磁盘空间扩展思路一致.原因在于xen/kvm默认的虚拟机磁盘格式为raw,所以方式可以通用. raw磁盘格式扩展思路如下 (1) 新添加一块raw格式的磁盘加入到 ...

  7. “全栈2019”Java第八十章:外部类是否能实现本类中的接口?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. mysqli扩展库应用---程序范例

    通过mysqli扩展库对用户表user1进行增删改查操作,用户表user1结构如下: 1,建立数据库操作类库mysqliTool.class.php,代码如下: <?php class mysq ...

  9. linux设置ip别名

    修改文件 # vi /etc/hosts 添加地址和别名 192.168.222.126 s1 ##前面是机器ip,后面是别名 测试 [root@bogon /]# ping s1 PING s1 ( ...

  10. 简单的数字校验JS

    /** *张衍涛 * 数字校验 v:校验的元素 l:要保留的小数点位数 */ function checkNumber(v,l){ var val=v.value; if(isNaN(val) || ...