首页> 文章> 详情

Shell变量的定义、赋值和删除

教程分享 > Linux和Shell教程 (1091) 2024-05-16 11:10:29

定义变量

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

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

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

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

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

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


变量定义举例:

url=https://www.leftso.com/c/linux-shell
echo $url
name='技术博客'
echo $name
author="leftso"
echo $author

使用变量

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

author="leftso"
echo $author
echo ${author}

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

skill="Java"
echo "I am good at ${skill}Script"

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

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

修改变量的值

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

url="https://www.leftso.com"
echo ${url}
url="https://www.leftso.com/c/linux-shell"
echo ${url}

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

单引号和双引号的区别

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

#!/bin/bash

url="https://www.leftso.com/c/linux-shell"
website1='技术博客:${url}'
website2="技术博客:${url}"
echo $website1
echo $website2

运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

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

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

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

将命令的结果赋值给变量

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

variable=`command`
variable=$(command)

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

例如,我在 demo 目录中创建了一个名为 log.txt 的文本文件,用来记录我的日常工作。下面的代码中,使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。

[mozhiyan@localhost ~]$ cd demo
[mozhiyan@localhost demo]$ log=$(cat log.txt)
[mozhiyan@localhost demo]$ echo $log
正在编写Shell教程,教程地址:https://www.leftso.com/c/linux-shell
[mozhiyan@localhost demo]$ log=`cat log.txt`
[mozhiyan@localhost demo]$ echo $log
正在编写Shell教程,教程地址:https://www.leftso.com/c/linux-shell

只读变量

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

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

#!/bin/bash

myUrl="https://www.leftso.com/c/linux-shell"
readonly myUrl
myUrl="https://www.leftso.com/c/linux-shell"


运行脚本,结果如下:

bash: myUrl: This variable is read only.

删除变量

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

unset variable_name

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

举个例子:

#!/bin/sh

myUrl="https://www.leftso.com/c/linux-shell"
unset myUrl
echo $myUrl


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

https://www.leftso.com/article/890.html

相关文章

定义变量Shell 支持以下三种定义变量的方式:variable=value variable='value' variable="value"variable 是变量名,value 是赋给...
ddos攻击属于网络攻击的常见模式之一。这里写一个能简单防御的脚本ddos-deflate脚本的安装和卸载
该脚本主要用于检查tomcat进程是否在线,如果不在线就启动tomcat服务#!/bin/sh res=`ps -ef|grep /home/xqlee/tomcat/bin/bootstra...
漏洞概况Jenkins有一个内置的命令行界面(CLI),可从脚本或shell环境访问Jenkins。Jenkins漏洞修复方案讲解
acme.sh说明acme.sh是一个Let's SSL证书颁发的官方推荐shell脚本开源免费安装acme.shcurl https://get.acme.sh | sh提示:普通用户和 ro...
acme.sh脚本docker方式使用获取免费SSL证书环境docker构建version:"3.8"services:acme.sh:image:neilpang/acme.sh:3.0.4c...
查看jenkin的进程idps -ef|grep jenkins.war|grep -v "grep"|awk '{print $2}'执行结果参考:[root@test-server-2 bi...
Linux crontab常用表达式查看crontab任务crontab -l编辑crontab任务crontab -e每隔多少秒执行一次脚本* * * * * sleep 10; /bin/y...
rm -rf * 无法删除的文件正常情况下,Linux系统中,切换到某个目录然后执行 rm -rf * 命令是可以删除该目录下所有文件的,但是以下文件也是无法直接删除的点(.)开头的隐藏文件点(...
Nginx 限流组件limit_req limit_req作用: 限制用户(同一个ip)在给定时间内HTTP请求的数量, 流量限制主要用作安全目的, 可以防止大量请求的...
skywalking 是一款不错的java apm监控服务,比zipkin功能更强大,需要的服务器配置也更多一些
继前面讲解了jenkin的安装Jenkins 2.319.1 LTS WAR文件安装方式 这里讲解下jenkin的基础部署流程
btrfs命令删除:btrfs subvolume del dirname例子: #普通的目录通过rm就可以被删除 dev@ubuntu:/mnt/btrfs$ rm -r dir2 ...
GrayLog admin账号修改密码(docker版)由于graylog的admin账号不是配置到数据库中,而是配置到配置文件/etc/graylog/server/server.conf里面...
如果是直接部署的 nexus, 需要修改 $install-dir/bin/nexus.vmoptions 文件 ,添加参数-Xms128m -Xmx512m -XX:MaxDirectMe...