如何在shell脚本中使用变量
创始人
2024-03-01 13:42:33
0

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

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

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

系统定义的变量:

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

系统定义的变量意义
BASH=/bin/bashBash 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/bashShell 名称
USERNAME=linuxtechi当前登录的用户名

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

# echo $HOME
# echo $USERNAME

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

$ cat myscript

#!/bin/bash
# display user information from the system.
echo “User info for userid: $USER”
echo UID: $UID
echo HOME: $HOME 

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

$ echo “The cost of the item is $15”
The cost of the item is 5

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

$ echo “The cost of the item is \$15”
The cost of the item is $15

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

用户定义的变量:

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

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

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

var1=10
var2=-57
var3=testing
var4=“still more testing”

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

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

$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$

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

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

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

$ cat test4
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
$

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

$ chmod u+x test4
$ ./test4
The resulting value is 10
$

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

value2=value1

你会获得下面的输出:

$ ./test4    
The resulting value is value1
$

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

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

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

**testing=`date`**

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

$ cat test5
#!/bin/bash
# using the backtick character
testing=`date`
echo "The date and time are: " $testing
$

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

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

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

例:

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

via: http://www.linuxtechi.com/variables-in-shell-scripting/

作者:Pradeep Kumar 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

相关内容

CentOS Bash S...
CentOS Bash Shell:从入门到高效操作的全面指南 B...
2025-05-09 06:17:17
AI赋能+通专融合+产教融...
0 引 言 新工科是指以信息技术为核心,融合多学科知识和技术,致力...
2025-05-08 09:17:58
速递|苹果AI生态再添盟友...
图片来源:Anthropic 据彭博社报道,苹果与Anthropi...
2025-05-04 14:49:54
苹果发力AI编程:与Ant...
【环球网科技综合报道】5月3日消息,据外媒报道,苹果与AI领域的重...
2025-05-03 10:16:16
外卖“三国杀”开新局,饿了...
【潮汐商业评论/原创】 01 新战役,新变量 外卖行业,又迎来了新...
2025-04-20 11:18:18
OpenAI发布新款AI模...
钛媒体App 4月17日消息,OpenAI发布新款AI模型o3和o...
2025-04-17 08:14:27

热门资讯

使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
Bazzite:专为 Stea... 为 Linux 桌面或者 Steam Deck 做好游戏准备,听起来都很刺激!对于一个专为 Linu...