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

编程教程 > Linux (1431) 2024-11-26 14:39:04

定义变量

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

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

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

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

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

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


变量定义举例:

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

使用变量

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

author="xqlee"
echo $author
echo ${author}

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

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

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

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

修改变量的值

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

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

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

单引号和双引号的区别

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

#!/bin/bash

url="https://blog.xqlee.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://blog.xqlee.com/c/linux-shell
[mozhiyan@localhost demo]$ log=`cat log.txt`
[mozhiyan@localhost demo]$ echo $log
正在编写Shell教程,教程地址:https://blog.xqlee.com/c/linux-shell

只读变量

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

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

#!/bin/bash

myUrl="https://blog.xqlee.com/c/linux-shell"
readonly myUrl
myUrl="https://blog.xqlee.com/c/linux-shell"


运行脚本,结果如下:

bash: myUrl: This variable is read only.

删除变量

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

unset variable_name

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

举个例子:

#!/bin/sh

myUrl="https://blog.xqlee.com/c/linux-shell"
unset myUrl
echo $myUrl


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


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
定义变量Shell 支持以下三种定义变量的方式:variable=value variable='value' variable="value"variable 是变量名,value 是赋给...
问题描述Jenkins pipeline 流水线 执行 sh命令/shell脚本遇到 exit code 1。主要是部分工具有特殊问题,例如grep工具,在找得
主要记录Linux系统中的shell脚本编程时。常遇到的一些语法用处记录。持续更新。
该脚本主要用于检查tomcat进程是否在线,如果不在线就启动tomcat服务#!/bin/sh res=`ps -ef|grep /home/xqlee/tomcat/bin/bootstra...
linux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件,Linux,samba,smbclient
Postman 环境变量使用Postman环境变量配置添加一个dev的环境和添加一些dev的环境变量Postman环境变量使用 环境选择变量使用使用双大括号包裹变量名称postman环境变量查看...
了解python中的变量,声明局部变量和全局变量
linux系统中ftp 上传和下载文件shell脚本编写
ddos攻击属于网络攻击的常见模式之一。这里写一个能简单防御的脚本ddos-deflate脚本的安装和卸载
Postman获取返回值数据并保存到环境变量中首先是普通请求一个接口返回数据示例接下来我们将学校名称也就是字段xxmc 赋值到postman变量xxmc中并打印出来首先编写请求完毕后的脚本接下来...
Docker MySQL数据库备份脚本参考 title(backup.sh)#!/bin/sh# useage# /path/to/backup.sh dbNa
概述windows 系统配置环境变量的详细介绍,本教程理论兼容windows xp - windows 11(最新版)。本例以window 11 系统为例Win
某些情况需要在thymeleaf 模板文件中定义变量,使用参考 定义单个参数:<!doctype html&gtl;<html lang="zh" xmlns="htt
内置变量$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参
文件夹不存在则创建if [ ! -d "/data/" ];thenmkdir /dataelseecho "文件夹已经存在"fi文件存在则删除if [ ! -