Shell变量的用法规则

变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。
 

定义变量


Shell 支持以下三种定义变量的方式:

variable=value
variable='value'
variable="value"

variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来使用单引号和使用双引号也是有区别的,稍后我们会详细说明。

注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

Shell 变量的命名规范和大部分编程语言都一样:

  • 变量名由数字、字母、下划线组成;
  • 必须以字母或者下划线开头;
  • 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

变量定义举例:

url=http://www.baidu.com
echo $url
name='test'
echo $name
author="test"
echo $author

 

使用变量


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

author="test"
echo $author
echo ${author}

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

[root@localhost ~]# skill="Java"
[root@localhost ~]# echo "I am good at ${skill}Script"
I am good at JavaScript

如果不给 skill 变量加花括号,写成echo "I am good at $skillScript"解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果I am good at 就不是我们期望的样子了。
 

 

修改变量的值


已定义的变量,可以被重新赋值,如:

url="http://www.baidu.com"
echo ${url}
url="http://www.jd.com"
echo ${url}

第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$

 

 

单引号和双引号的区别


定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

url="http://www.baidu.com"
website1='website:${url}'
website2="website:${url}"
echo $website1  --结果 website:${url}
echo $website2   -- 结果 website:http://www.baidu.com

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

我的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

 

 

将命令的结果赋值给变量


Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。

[root@localhost]$ log=$(cat log.txt)
[root@localhost]$ echo $log
this is my test
[root@localhost]$ log=`cat log.txt`
[root@localhost]$ echo $log
this in my test

把一个命令作为变量

[root@localhost ~]# date
Thu Jan 10 21:30:11 CST 2019
[root@localhost ~]# CMD=`date`
[root@localhost ~]# echo $CMD
Thu Jan 10 21:30:18 CST 2019
[root@localhost ~]# CMD1=$(date)
[root@localhost ~]# echo $CMD1
Thu Jan 10 21:30:18 CST 2019

提示:

1、“CMD=`date`”注意命令变量前后的字符``(为键盘 tab 键上面的那个,不是单引号)
2、在变量名前加$,可以取得此变量的值,使用 echo 命令可以显示变量的值,$A 和${A}的写法不同,但功能是一样的,推荐使用后者的语法或“${A}” 的用法。
3、${WEEK}day 若变量和其他字符组成新的变量就必须给变量加上大括号{}。
4、养成将所有字符串变量用双引号括起来使用的习惯,将会减少很多编程是遇到的怪异的错误。具体使用方法如:”$A”或”${A}”的用法。
生产环境常见应用: 对站点按天打包生成不同的文件名
[root@localhost ~]# CMD=$(date +%F)
[root@localhost ~]# echo $CMD
2019-01-10
[root@localhost ~]# echo $(date +%F).tar.gz
2019-01-10.tar.gz
[root@localhost ~]# echo `date +%F`.tar.gz
2019-01-10.tar.gz
[root@localhost ~]# tar zcvf etc_$(date +%F).tar.gz /etc

这里其实也是做了变量的合并,就是变量加上其他字符串做一个组合。 

 

 

只读变量


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

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

myUrl="http://www.test.com"
readonly myUrl
myUrl="http://www.test1.com"

运行脚本,结果如下:

bash: myUrl: This variable is read only.

 

删除变量


使用 unset 命令可以删除变量。语法:

unset variable_name

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

举个例子:

#!/bin/sh

myUrl="http://test.com"
unset myUrl
echo $myUrl

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值