Shell 脚本知识回顾 (二) —— Shell变量

一、Shell变量:Shell变量的定义、删除变量、只读变量、变量类型

Shell支持自定义变量。

定义变量

定义变量时,变量名不加美元符号($),如:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. variableName="value"  

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

变量定义举例:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. myUrl="http://see.xidian.edu.cn/cpp/linux/"  
  2. myNum=100  


使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. your_name="mozhiyan"  
  2. echo $your_name  
  3. echo ${your_name}  

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. for skill in Ada Coffe Action Java   
  2. do  
  3.     echo "I am good at ${skill}Script"  
  4. done  
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

重新定义变量

已定义的变量,可以被重新定义,如:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. myUrl="http://see.xidian.edu.cn/cpp/linux/"  
  2. echo ${myUrl}  
  3. myUrl="http://see.xidian.edu.cn/cpp/shell/"  
  4. echo ${myUrl}  
这样写是合法的,但注意,第二次赋值的时候不能写 $myUrl="http://see.xidian.edu.cn/cpp/shell/",使用变量的时候才加美元符($)。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. myUrl="http://see.xidian.edu.cn/cpp/shell/"  
  3. readonly myUrl  
  4. myUrl="http://see.xidian.edu.cn/cpp/danpianji/"  

运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.


删除变量

使用 unset 命令可以删除变量。语法:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. unset variable_name  

变量被删除后不能再次使用;unset 命令不能删除只读变量。

举个例子:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"  
  3. unset myUrl  
  4. echo $myUrl  

上面的脚本没有任何输出。


变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


二、Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

     前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量

例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. $echo $$  
运行结果

29949


特殊变量列表
变量 含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

请看下面的脚本:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. echo "File Name: $0"  
  3. echo "First Parameter : $1"  
  4. echo "First Parameter : $2"  
  5. echo "Quoted Values: $@"  
  6. echo "Quoted Values: $*"  
  7. echo "Total Number of Parameters : $#"  

运行结果:

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2


$* 和 $@ 的区别

      $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

      但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

      下面的例子可以清楚的看到 $* 和 $@ 的区别:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. echo "\$*=" $*  
  3. echo "\"\$*\"=" "$*"  
  4. echo "\$@=" $@  
  5. echo "\"\$@\"=" "$@"  
  6. echo "print each param from \$*"  
  7. for var in $*  
  8. do  
  9.     echo "$var"  
  10. done  
  11. echo "print each param from \$@"  
  12. for var in $@  
  13. do  
  14.     echo "$var"  
  15. done  
  16. echo "print each param from \"\$*\""  
  17. for var in "$*"  
  18. do  
  19.     echo "$var"  
  20. done  
  21. echo "print each param from \"\$@\""  
  22. for var in "$@"  
  23. do  
  24.     echo "$var"  
  25. done  

执行 ./test.sh "a" "b" "c" "d",看到下面的结果:

$*=  a b c d
"$*"= a b c d
$@=  a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d


退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

不过,也有一些命令返回其他值,表示不同类型的错误。

下面例子中,命令成功执行:

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$
$? 也可以表示函数的返回值,后续将会讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell 脚本知识回顾 (一) —— 基础篇

一、Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令…

c实现面向对象编程(3)

http://blog.csdn.net/kennyrose/article/details/7564105

C 与 JAVA 的对比分析

Sun 公司推出的Java 是面向对象程序设计语言,其适用于Internet 应用的开发,称为网络时代重要的语言之一。Java 可以用认为是C 的衍生语言,与C 在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致&#xff1…

红帽集群RHCS

1、简介:RHCS是RedHatClusterSuite的缩写,也就是红帽子集群套件,RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合,它将集群系统中三大集群架构融合一体,可以给web应用、数据库应用…

Java 基础——类的加载

当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三个步骤来对该类进行初始化,JVM将会连续完成这三个步骤,也把这三个步骤统称为类加载或类初始化; 类加载指的是…

HDUOJ-----1556Color the ball

Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6787 Accepted Submission(s): 3549 Problem DescriptionN 个气球排成一排&#xff0c;从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…

《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?

《在你身边&#xff0c;为你设计》-前端UI必读出自腾讯CDChttp://cdc.tencent.com/?p6761今天听同事说这本书写的非常好&#xff0c;改变了他关于前端UI的许多看法&#xff0c;可谓&#xff1a;醍醐灌顶。可惜我网上找了下都需要Money买&#xff0c;哪位有在线阅读、PDF下载地…

Java 基础——类和对象

Java作为一种面向对象语言。支持以下基本概念&#xff1a; •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究类与对象的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c…

报告显示Q2 Android平板电脑全球市场份额达67%

网易科技讯 7月30日消息&#xff0c;据国外媒体报道&#xff0c;市场调研公司Strategy Analytics最新公布的报告显示&#xff0c;2013年第二季度平板电脑全球出货量达到5170万台&#xff0c;比去年同期的3610万台增长43&#xff05;&#xff0c;其中Android、iOS和Windows平板电…

活期储蓄账目管理系统

基本要求&#xff1a;实现储户开户、销户、存入、支出等活动。要求能查找储户的账户&#xff0c;实现存款、取款、插入、删除等操作。具体功能如下&#xff1a;&#xff08;1&#xff09;实现储户开户。&#xff08;2&#xff09;实现储户销户。&#xff08;3&#xff09;向某账…

面向过程 VS 面向对象

面向过程&#xff08;Process Oriented&#xff09;这个词是在面向对象&#xff08;Object Oriented&#xff09;出现之后为与之相对而提出的。其实它在以前基本被叫做“结构化编程”。 早期的程序设计&#xff0c;大量使用共享变量&#xff08;全局变量&#xff09;和GOTO语句…

一、OpenStack架构

DashBoardHorizon提供WEB界面ComputerNova计算也就是虚拟机NetworkingNeutron提供给nova网络支持Object StorageSwift提供对象存储Block StorageCinder提供云硬盘给nova&#xff0c;同时备份到SwiftIdentity SserviceKeystone提供所有组件的认证Image ServiceGlance提供给nova镜…

Java 三大特性 —— 多态

Java中多态性的实现 一、什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应…

linux /proc/cpuinfo文件分析

为什么80%的码农都做不了架构师&#xff1f;>>> 基于不同指令集&#xff08;ISA&#xff09;的CPU产生的/proc/cpuinfo文件不一样&#xff0c;基于X86指令集CPU的/proc/cpuinfo文件包含如下内容&#xff1a; processor  &#xff1a; 0vendor_id  &#xff1a;…

Java 高级类(下) —— 内部类和匿名类

Java内部类&#xff08;Inner Class&#xff09;&#xff0c;类似的概念在C里也有&#xff0c;那就是嵌套类&#xff08;Nested Class&#xff09;&#xff0c;乍看上去内部类似乎有些多余&#xff0c;它的用处对于初学者来说可能并不是那么显著&#xff0c;但是随着对它的深入…

wcf会话、实例化、并发

在asp.net中含有会话&#xff0c;是保存值&#xff0c;供所有的程序使用&#xff0c;同样在wcf中也有会话&#xff0c;供多个客户端使用。 会话的支持通常在契约定义的开始标出&#xff0c;如下 [ServiceContract(Namespace "http://Microsoft.ServiceModel.Samples"…

Java 高级类(上) —— 抽象类和接口

在面向对象的概念中&#xff0c;我们知道所有的对象都是通过类来描绘的&#xff0c;但是并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、 设…

【Git入门之五】版本管理

2019独角兽企业重金招聘Python工程师标准>>> 1.版本回退 我们先看一下从项目开始到现在做了什么操作。 [cpp] view plaincopy #总共是4个操作 $ git log --prettyoneline c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03 a25c58804cb3f4045564fc0e…

Java 进阶——单例模式

一、单例模式概念及特点 Java中单例模式是一种常见的设计模式&#xff0c;单例模式分三种&#xff1a;懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点&#xff1a; 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其…