bash变量类别:

本地变量 : 又叫局部变量,仅对当前shell进程有效

环境变量 : 当前shell及其子shell,子子shell….

特殊变量 : $?  上一个命令执行的状态,0表示执行成功。失败的代码有很多。

  1. zhangsan@huanghao-Virtual-Machine:/$ cm kk
  2. 程序“cm”尚未安装。 如需运行 'cm',请要求管理员安装 'config-manager' 软件包
  3. zhangsan@huanghao-Virtual-Machine:/$ echo $?
  4. 127
  5. zhangsan@huanghao-Virtual-Machine:/$ echo $?
  6. 0

变量赋值:

  1. zhangsan@huanghao-Virtual-Machine:/$ age=23
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $age
  3. 23

将变量的值赋给另一个变量:

  1. zhangsan@huanghao-Virtual-Machine:/$ age=23
  2. zhangsan@huanghao-Virtual-Machine:/$ age1=$age
  3. zhangsan@huanghao-Virtual-Machine:/$ echo $age1
  4. 23

现在有个问题,执行上面代码后,age和age1的值各是多少?age1的值会不会随着age的变化而变化?下面将age新赋一个值 ,看一下

  1. zhangsan@huanghao-Virtual-Machine:/$ age=24
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $age
  3. 24
  4. zhangsan@huanghao-Virtual-Machine:/$ echo $age1
  5. 23

现看下面这段代码,当age的值存在时,把age的值赋给变量,不存在是将后面的值赋给变量

  1. zhangsan@huanghao-Virtual-Machine:/$ result=${age-40}
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $result
  3. 24
  4. zhangsan@huanghao-Virtual-Machine:/$ result=${age2-40}
  5. zhangsan@huanghao-Virtual-Machine:/$ echo $result
  6. 40

当age值存在时赋值,不存在时返回错误信息:

  1. zhangsan@huanghao-Virtual-Machine:/$ result=${age?'error'}
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $result
  3. 24
  4. zhangsan@huanghao-Virtual-Machine:/$ result=${age2?'error'}
  5. bash: age2: error

想想上面的代码有什么用?试一下

  1. zhangsan@huanghao-Virtual-Machine:/$ result=${age3?'age3 does not exist'}
  2. bash: age3: age3 does not exist

输出:

  1. echo $age
  2. echo "hello"
  3. #输出后不换行
  4. echo -n 'hello'
  5. #让转义符生效
  6. echo -e 'hello\tworld'
  7. echo -e "hello\nworld"

单引号: 强引用 ,引号里的字符串不论是什么,原封不动

双引号: 弱引用,引号里的变量替换成变量的值

反引号: 就是键盘上~下面的字符,命令替换

  1. zhangsan@huanghao-Virtual-Machine:/$ age=23
  2. zhangsan@huanghao-Virtual-Machine:/$ echo 'i am $age'
  3. i am $age
  4. zhangsan@huanghao-Virtual-Machine:/$ echo "i am $age"
  5. i am 23
  6. zhangsan@huanghao-Virtual-Machine:/$ echo "today is `date +%F`"
  7. today is 2016-01-25

变量的引用

${varname}

花括号有时可以省略,有时不行,看一下

  1. zhangsan@huanghao-Virtual-Machine:/$ age=23
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $age
  3. 23
  4. zhangsan@huanghao-Virtual-Machine:/$ animal=pig
  5. zhangsan@huanghao-Virtual-Machine:/$ echo "There are some ${animal}s"
  6. There are some pigs
  7. zhangsan@huanghao-Virtual-Machine:/$ echo "There are some $animals"
  8. There are some

为什么最后面输出显示变量没有值?因为将animals识别成一个变量了。

变量的撤销:

  1. zhangsan@huanghao-Virtual-Machine:/$ age=23
  2. zhangsan@huanghao-Virtual-Machine:/$ echo $age
  3. 23
  4. zhangsan@huanghao-Virtual-Machine:/$ unset age
  5. zhangsan@huanghao-Virtual-Machine:/$ echo $age

只读变量:不可以撤销,不可以修改

  1. zhangsan@huanghao-Virtual-Machine:/$ readonly animal=pig
  2. bash: animal: 只读变量
  3. zhangsan@huanghao-Virtual-Machine:/$ unset animal
  4. bash: unset: animal: 无法反设定: 只读 variable

环境变量的声明:

  1. zhangsan@huanghao-Virtual-Machine:/$ export AGE

也可以在声明的时候赋值

  1. zhangsan@huanghao-Virtual-Machine:/$ export AGE

环境变量名一般全部大写

下面介绍几个命令:

  1. #查看所有环境变量的命令(3个)
  2. env
  3. printenv
  4. export

新增环境变量路径

  1. export PATH=/usr/local/apache/bin:$PATH

命令替换:

  1. zhangsan@huanghao-Virtual-Machine:/$ echo "Today is `date +%F`"
  2. Today is 2016-01-25
  3. zhangsan@huanghao-Virtual-Machine:/$ echo `date +%F-%H:%M:%S`
  4. 2016-01-25-16:47:22

生成序列

  1. zhangsan@huanghao-Virtual-Machine:/$ seq 3
  2. 1
  3. 2
  4. 3
  5. zhangsan@huanghao-Virtual-Machine:/$ seq 3 6
  6. 3
  7. 4
  8. 5
  9. 6
  10. zhangsan@huanghao-Virtual-Machine:/$ seq 1 3 10
  11. 1
  12. 4
  13. 7
  14. 10

export 生成的环境变量会在shell重启或重启系统后丢失,那么我们则可以通过配置文件来保存环境变量

  1. #全局文件
  2. /etc/profile, /etc/profile.d/* , /etc/bashrc
  3.  
  4. #个人文件
  5. ~/.bash_profile ~/.bashrc

配置文件加载顺序

  1. #交互式
  2. /etc/profile /etc/profile.d/* /bash_profile , ~/.bashrc /etc/bashrc
  3.  
  4. #非交互式
  5. ~/.bashrc /etc/bashrc /etc/profied/*
  6.  
  7. #如果同一个环境变量存在多个配置文件中,以最后加载的配置文件为准

配置文件类别

profile 类:设定环境变量,运行命令或脚本(用户登录之前或bash启动之前)

bashrc 类:设定本地变量,设定命令别名

配置文件修改完成之后,需要使用下面命令使其生效,比如:

souce ~/.bash_profile

命令别名:

  1. alias vi=vim
  2. alias cdnet='cd /etc/sysconfig/network-scripts/'
  3. unalias vi #撤消别名

输入重定向:

command < file

输出重定向

command > file

1 是标准输出  2是错误输出

command 2>file

正确和错误统统重定向:

command > file 2>&1   #都输出到file

command > file 2 > file2  #输出到不同的文件

command &>file   合并输出流

管道:

command | command2       #把第一个命令的输出当作第二个命令的输入

command | command2 | command3 | … | commandN

需要注意的是管道只传递正确的执行结果,遇到错误就终止了

  1. zhangsan@huanghao-Virtual-Machine:/$ echo "abc" | tr "a-z" "A-Z"
  2. ABC
  3. zhangsan@huanghao-Virtual-Machine:/$ echo 'AbCd' | tr 'ABCD' 'abcd'
  4. abcd

记录一个命令

cut –d’ ’ –f2 将字符串以空格切割,输出第二个

cut –d: –f2   以:切割

uniq  移出重复的行

有时会遇到这种情况:

  1. zhangsan@huanghao-Virtual-Machine:/$ ls /var/log |file
  2. Usage: file [-bchikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type]
  3. [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ...
  4. file -C [-m magicfiles]
  5. file [--help]

因为file 后面必须要跟上一个文件,没有就不行, 这种情况下我们可以用-代替

  1. zhangsan@huanghao-Virtual-Machine:/$ ls /var/log |file -
  2. /dev/stdin: ASCII text

file  是查看文件类型

再记录一个命令tee

  1. command | tee /tmp/tee.out |command2 #将command的结果保存到tee.out然后再传递给command2

shell(1)的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  10. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. Codevs No.1245 最小的N个和

    2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最 ...

  2. Yii CModel中rules验证规则

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  3. Sqoop 命令

    1)list-databases     List available databases on a server sqoop list-databases --connect jdbc:db2:// ...

  4. Linux 系统 root下目录结构

    /bin 用于存放普通用户可执行的命令./boot 用于存放Linux 启动所必需的文件,即我们建立的boot 分区的内容./dev 用于存放系统的设备文件./etc 用于存放系统的各种配置文件./h ...

  5. Spring SimpleJdbcTemplate batchUpdate() example

    In this tutorial, we show you how to use batchUpdate() in SimpleJdbcTemplate class. See batchUpdate( ...

  6. [iOS 多线程 & 网络 - 2.11] - ASI框架上传文件

    A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求     2.上传相册相片 UIImagePickerCon ...

  7. c++地址对齐

    在一些计算机上,由于性能方面的原因,2个字节的变量,必须放在2的倍数的地址中,4个字节的,就必须放在4的倍数中的地址中,以此类推. 也就是说,如果有3个占用两个字节的变量,分别为:A,B,C,如下图: ...

  8. static关键字修饰类

    今天继续研究公司的新项目,据说是京东的架构,研究看了一番,果然很牛逼,大致是Maven+spingmvc+spring+mybatis+ehcache+velocity来搭建的,数据库用的是mysql ...

  9. android知乎小圆圈刷新效果

    前几天看到包括知乎在内的很多应用都使用到了一种小圆圈划动刷新的效果,仔细查了一下,原来是android v7包里面最新的刷新效果.使用起来也是十分简单的. 首先先建立一个activity,在布局文件里 ...

  10. PostgreSQL的 initdb 源代码分析之一

    开始第一段: int main(int argc, char *argv[]) { /* * options with no short version return a low integer, t ...