如何在shell脚本中使用变量

简介:

如何在shell脚本中使用变量

在每种编程语言中,变量都扮演了一个重要的角色。在Linux shell脚本编程中,我们使用两种类型的变量:系统定义的变量用户定义的变量

shell脚本中的变量是用来调用一个数值或者字符值的手段。与正规的编程语言不同的是,shell脚本不要求你去为变量声明一个类型

在本文中,我们将讨论shell脚本编程中的变量及其类型,以及如何设置和使用这些变量。

系统定义的变量:

这些变量由操作系统(Linux)自身创建并维护,通常它们以大写字母定义,我们可以通过命令“$ set”来查看这些变量。下面列出了部分系统定义的变量:

系统定义的变量 意义
BASH=/bin/bash Bash Shell 名称
BASH_VERSION=4.1.2(1) Bash 版本
COLUMNS=80 你的屏幕宽度(列数)
HOME=/home/linuxtechi 用户家目录
LINES=25 你的屏幕高度(行数)
LOGNAME=LinuxTechi 当前登录用户的名字
OSTYPE=Linux 操作系统类型
PATH=/usr/bin:/sbin:/bin:/usr/sbin 可执行文件搜索路径
PS1=[\u@\h \W]\$ 命令行提示符
PWD=/home/linuxtechi 当前工作目录
SHELL=/bin/bash Shell 名称
USERNAME=linuxtechi 当前登录的用户名

要打印以上变量的值,可以使用echo command命令,如下:

 
 
  1. # echo $HOME
  2. # echo $USERNAME

我们可以通过在环境变量名前前置一个美元符号来从你的脚本里输入环境变量。请看下面脚本演示:

 
 
  1. $ cat myscript
  2.  
  3. #!/bin/bash
  4. # display user information from the system.
  5. echo User info for userid: $USER
  6. echo UID: $UID
  7. echo HOME: $HOME

注意:echo命令中的环境变量在脚本运行时会被它们的值替代。同时注意,我们可以再第一个字符串的双引号中放置$USER系统变量,而shell脚本仍然可以明白我们的意思。然而,该方法有一个缺点。看下面这个例子:

 
 
  1. $ echo The cost of the item is $15
  2. The cost of the item is 5

很明显,那不是我们说希望的。无论何时,当脚本遇见引号中的美元符号时,它都会认为你是在调用一个变量。在本例中,该脚本试着显示变量$1(而这个变量并没有定义),然后显示数字5。要显示实际上的美元符号,你必须前置一个反斜线字符

 
 
  1. $ echo The cost of the item is \$15
  2. The cost of the item is $15

那样好多了。反斜线允许shell脚本将美元符号解释成为实际的美元符号,而不是变量。

用户定义的变量:

这些变量由用户定义。shell脚本允许我们在脚本中设置并使用我们自己的变量。设置变量允许你临时存储数据并在脚本中使用,让shell脚本看起来像一个真正的计算机程序。

用户变量可以是任何不超过20个的字母、数字或者下划线字符的文本字符串(LCTT 译注:变量只能以字母或下划线开头)。用户变量是大小写敏感的,因此,变量Var1和变量var1是不同的变量。这个小规则常常让新手编写脚本时麻烦重重。

我们可以通过等于号为变量赋值。变量,等于号和值(对于新手又是个麻烦的地方)之间不能有空格。下面是几个给用户变量赋值的例子:

 
 
  1. var1=10
  2. var2=-57
  3. var3=testing
  4. var4=“still more testing

shell脚本为变量值自动确定数据类型。shell脚本内定义的变量会在脚本运行时保留它们的值,当脚本完成后则删除这些值。

就像系统变量一样,用户变量也可以使用美元符号来调用:

 
 
  1. $ cat test3
  2. #!/bin/bash
  3. # testing variables
  4. days=10
  5. guest="Katie"
  6. echo "$guest checked in $days days ago"
  7. days=5
  8. guest="Jessica"
  9. echo "$guest checked in $days days ago"
  10. $

运行脚本会产生以下输出:

 
 
  1. $ chmod u+x test3
  2. $ ./test3
  3. Katie checked in 10 days ago
  4. Jessica checked in 5 days ago
  5. $

每次变量被调用,它都会变成了当前分配给它的值。有一点很重要,当调用一个变量值时,你使用美元符号,但是当为一个变量分配一个值时,你不能用美元符号。下面用例子来说明:

 
 
  1. $ cat test4
  2. #!/bin/bash
  3. # assigning a variable value to another variable
  4. value1=10
  5. value2=$value1
  6. echo The resulting value is $value2
  7. $

当你使用赋值语句中value1变量的时,你仍然必须使用美元符号。这段代码产生了如下输出:

 
 
  1. $ chmod u+x test4
  2. $ ./test4
  3. The resulting value is 10
  4. $

如果你忘了美元符号,而又让value2赋值行看起来像这样:

value2=value1

你会获得下面的输出:

 
 
  1. $ ./test4
  2. The resulting value is value1
  3. $

没有美元符号,shell解释变量名为普通文本字符串,这极有可能不是你想要的。

在shell变量中使用反引号(`):

反引号允许你将shell命令的输出赋值给变量。虽然这似乎没什么大不了,但它是脚本编程中主要的构建基块。你必须使用反引号将整个命令行包含起来:

 
 
  1. **testing=`date`**

shell会在反引号中运行命令,然后将输出结果赋值给变量testing。下面的例子给出了如何使用一个常规shell命令的输出结果来创建一个变量:

 
 
  1. $ cat test5
  2. #!/bin/bash
  3. # using the backtick character
  4. testing=`date`
  5. echo "The date and time are: " $testing
  6. $

变量testing接收来自date命令的输出结果,而它又在echo语句中被调用。运行脚本会产生如下输出:

 
 
  1. $ chmod u+x test5
  2. $ ./test5
  3. The date and time are: Mon Jan 31 20:23:25 EDT 2011

:在bash中,你也可以选用$(...)语法来替换反引号(`),它有个优点就是可以重用(re-entrant)。

例:

 
 
  1. $ echo " Today’s date & time is :" $(date)
  2. Todays date & time is : Sun Jul 27 16:26:56 IST 2014

原文发布时间:2014-09-16

本文来自云栖合作伙伴“linux中国”
目录
相关文章
|
1天前
|
Unix Shell Linux
轻松编写 AIX Shell 脚本
轻松编写 AIX Shell 脚本
|
2天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
2天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
4天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
21 5
|
4天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
4天前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
|
5天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
13 3
|
11天前
|
弹性计算 运维 监控
|
11天前
|
存储 弹性计算 运维
自动化收集员工信息的Shell脚本
【4月更文挑战第30天】
10 0
|
12天前
|
弹性计算 运维 Shell
使用shell 脚本打印图形3
【4月更文挑战第29天】
21 0