第14章 环境和shell变量

1、使用变量时,尽量用花括号将之括起来,防止shell误解变量值。

2、设置变量时的不同模式

variable-name=value 设置实际值到variable-name
variable-name+value 如果设置了variable-name,则重设其值
variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
variable-name?value 如果未设置variable-name,显示系统错误信息
variable-name:=value 如果未设置variable-name,设置其值
variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换

3、使用unset命令清除设置,如:

  1. ~$ PC=enterprise
  2. ~$ echo ${PC}
  3. enterprise
  4. ~$ unset PC
  5. ~$ echo ${PC}

4、使用set命令显示所有本地shell变量。

5、将变量并排可以使变量结合在一起:

  1. echo ${variable-name}${variable-name}...

如:

  1. ~$ FIRST="Bruce "
  2. ~$ SURNAME="Willis"
  3. ~$ echo ${FIRST}${SURNAME}
  4. Bruce Willis

6、有时要测试是否已经设置或初始化变量。如果未设置或初始化,就可以使用另一个值。此命令格式为:

  1. ${variable:-value}

如:

  1. ~$ COLOR="blue"
  2. ~$ echo "The sky is ${COLOR:-gray} today"
  3. The sky is blue today
  4. ~$
  5. ~$ unset COLOR
  6. ~$ echo "The sky is ${COLOR:-gray} today"
  7. The sky is gray today

上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:

  1. ${variable:=value}

如:

  1. ~$ echo ${COLOR}
  2.  
  3. ~$ echo "The sky is ${COLOR:=gray} today"
  4. The sky is gray today
  5. ~$ echo ${COLOR}
  6. gray

7、测试变量是否取值,然后返回带有系统错误信息的结果,如下面例子测试变量file是否取值:

  1. ~$ echo "The file is ${FILE:?}"
  2. -bash: FILE: 参数为空或未设置

以上结果可读性不好,但是可以加入自己的脚本以增加可读性。如:

  1. ~$ echo "The file is ${FILE:?" sorry cannot locate the variable files"}"
  2. -bash: FILE: sorry cannot locate the variable files

8、设置只读变量,格式如下:

  1. variable-name=value
  2. readonly variable-name

如:

  1. ~$ TYPE_DEV="/dev/rmt/0n"
  2. ~$ echo ${TYPE_DEV}
  3. /dev/rmt/0n
  4. ~$ readonly TYPE_DEV
  5. ~$ TYPE_DEV="/dev/rmt/1n"
  6. -bash: TYPE_DEV: 只读变量

要查看所有只读变量,使用命令readonly即可。

9、环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。不像本地变量(只用于现在的shell)环境变量可用于所有子进程,包括编辑器、脚本和应用。

所有环境变量均为大写,环境变量应用于用户和进程前,必须用export命令导出。格式如下:

  1. VARIABLE_NAME=value;export VARIABLE_NAME

  1. VARIABLE_NAME=value
  2. export VARIABLE_NAME

使用env命令可以查看所有的环境变量。

10、位置变量参数

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能,。参数相关数目传入脚本,此数目可以任意多,单只有前9个可以被访问,使用shift命令可以改变这个限制。

如果向脚本传递Did You See The Full Moon信息,下面的表格讲解了如何访问每一个参数:

$0 $1 $2 $3 $4 $5 $6 $7 $8 $9
<> Did You See The Full Moon

11、特定变量参数

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程的进程ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误

第15章 引号

1、反引号

反引号用于设置系统命令的输出到变量。

下面的例子中,如:

  1. ~$ echo `date`
  2. 2014 04 11 星期五 16:03:13 CST

2、反斜线

如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:&*+^$`"|?。如:

  1. ~$ echo $$
  2. 1830
  3. ~$ echo \$$
  4. $$

第17章 条件测试

对文件、字符串和数字使用test命令;

对数字和字符串使用expr命令。

expr命令和执行数值输出。使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。

1、测试文件状态

test一般有两种格式,即:

test condition

[condition]

使用方括号时,要注意在条件两边加上空格。

常用条件表达式:

-d 目录
-f 正规文件
-L 符号链接
-r 可读
-s 文件长度大于0、非空
-w 可写
-u 文件有suid位设置
-x 可执行

如:

  1. ~/tools$ ls -l a.vim
  2. -rw------- 1 xxx xxx 31424 11 3 09:17 a.vim
  3. ~/tools$ [ -w a.vim ]
  4. ~/tools$ echo $?
  5. 0
  6. ~/tools$ test -w a.vim
  7. ~/tools$ echo $?
  8. 0
  9. ~/tools$ [ -x a.vim ]
  10. ~/tools$ echo $?
  11. 1

2、测试时使用逻辑操作符

有时比较两个文件状态,shell提供三个逻辑操作完成此功能:

-a 逻辑与
-o 逻辑或
! 逻辑否

如:

  1. ~/tools$ ls -l a.vim grep.vim
  2. -rw------- 1 xxx xxx 31424 11 3 09:17 a.vim
  3. -rw------- 1 xxx xxx 32997 11 3 10:42 grep.vim
  4. ~/tools$ [ -w a.vim -a -w grep.vim ]
  5. ~/tools$ echo $?
  6. 0
  7. ~/tools$ [ -w a.vim -a -x grep.vim ]
  8. ~/tools$ echo $?
  9. 1

3、字符串测试

有5种格式:

test "string"

test string_operator "string"

test "string" string_operator "string"

[ string_operator string ]

[ string string_operator string ]

string_operator可为

= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串

如:

  1. ~/tools$ [ -z $VARIABLE_NAME ]
  2. ~/tools$ echo $?
  3. 0
  4. ~/tools$ VARIABLE_NAME="name"
  5. ~/tools$ [ -z $VARIABLE_NAME ]
  6. ~/tools$ echo $?
  7. 1

4、测试数值

一般格式如下:

"number" numeric_operator "number"

[ "number" numeric_operator "number" ]

numberic_operator可为:

-eq 相等
-ne 不相等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-ge 第一个数大于或等于第二个数
-le 第一个数小于或等于第二个数

如:

  1. :~/tools$ NUMBER=130
  2. :~/tools$ [ "$NUMBER" -eq "130" ]
  3. :~/tools$ echo $?
  4. 0

可以使用逻辑操作符将两个测试表达式结合起来,只能在一对方括号中使用,如:

  1. :~/tools$ [ "990" -le "995" -a "123" -gt "33" ]
  2. :~/tools$ echo $?
  3. 0
  4. :~/tools$ [ "990" -le "995" -a "123" -gt "133" ]
  5. :~/tools$ echo $?
  6. 1

5、expr用法

一般用于整数值,但也可用于字符串,一般格式如下:

expr argument operator argument

如:

  1. :~/tools$ expr 10 + 10
  2. 20

使用乘号时,必须用反斜线屏蔽其特定含义,如:

  1. :~/tools$ expr 30 * 30
  2. expr: 语法错误
  3. :~/tools$ expr 30 \* 30
  4. 900

expr在循环中用于增量计算,如:

  1. :~/tools$ LOOP=0
  2. :~/tools$ `expr $LOOP + 1`

expr也有模式匹配功能,可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任意字符串重复0次或多次,如:

  1. :~/tools$ VALUE=account.doc
  2. :~/tools$ expr $VALUE : '.*'
  3. 11

在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件附属名:

  1. :~/tools$ expr $VALUE : '\(.*\).doc'
  2. account

Linux与unix shell编程指南的更多相关文章

  1. Linux与Unix shell编程指南(完整高清版).pdf

    找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...

  2. Linux 与 unix shell编程指南——学习笔记

    第一章    文件安全与权限 文件访问方式:读,写,执行.     针对用户:文件属主,同组用户,其它用户.     文件权限位最前面的字符代表文件类型,常用的如         d 目录:l 符号链 ...

  3. 摘自《Linux与unix shell编程指南》

    shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...

  4. Linux Unix shell 编程指南学习笔记(第五部分)

    第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...

  5. Linux Unix shell 编程指南学习笔记(第四部分)

    第十六章  shell脚本介绍 此章节内容较为简单,跳过. 第十七章   条件測试 test命令 expr命令 test  格式  test  condition     或者  [ conditio ...

  6. Linux Unix shell 编程指南学习笔记(第三部分)

    第十三章  登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...

  7. Linux Unix shell 编程指南学习笔记(第二部分)

    第七章  正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...

  8. Linux学习之Shell编程基础

    转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...

  9. linux下的Shell编程(3)shell里的流程控制

    if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...

随机推荐

  1. 2015-09-15-git配置

    https://help.github.com/articles/set-up-git/ git上传是忽略一些文件 在每个git的项目中有一个.gitignore文件,将忽略的文件或文件夹输入即可. ...

  2. [LC] 11. Container With Most Water

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  3. 如何手动添加jar包到本地maven仓库

    环境 win10    idea工具 1.确认已经安装好 mvn环境   MAVEN_HOME   D:\Tool\apache-maven-3.5.2 Path %MAVEN_HOME%\bin 2 ...

  4. 吴裕雄--天生自然 R语言开发学习:广义线性模型

    #----------------------------------------------# # R in Action (2nd ed): Chapter 13 # # Generalized ...

  5. 免密码 ssh 到其它机器

    背景:在配置 hadoop 的时候这样设置会比较方便.目标:A 机器上输入 ssh root@B 可以直接访问,不需要输入密码 步骤: 首先在 A 机器上生成密钥对,一路回车 1 ssh-keygen ...

  6. 用java实现的微信公众号爬虫

    Published: 2016-11-23 In Spider. tags: Spider 版权声明:本文为博主原创文章,未经博主允许不得转载. 思路: 直接从chuansong.me爬取,由于微信公 ...

  7. 【基础篇】hexo博客搭建教程

    [基础篇]搭建hexo博客(一) 作者:Huanhao bilibili:Mrhuanhao 前言 你是否想拥有属于自己的博客?你是否无奈与自己不会写网站而烦恼? 不要担心,本系列教程将会实现你白嫖的 ...

  8. 【最简单的vim教程】vim学习笔记-基础操作

    说明 C-字母 = Ctrl + 字母 char = 任意字符 开始编辑 insert 按键 功能 说明 i(I) insert 当前位置插入(当前行前) a(A) append 当前字符后面插入(当 ...

  9. 使用python抓取美团商家信息

    抓取美团商家信息 import requests from bs4 import BeautifulSoup import json url = 'http://bj.meituan.com/' ur ...

  10. C++走向远洋——24(项目一,三角形,复制构造函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...