Linux shell编程(三)shell脚本中的特殊变量详解

2023-11-09

(1)环境变量(全局变量)
环境变量一般使用export内置命令导出的变量,用于定义shell运行环境,保证shell命令能够正确执行,
shell通过环境变量来确定登录的用户名等信息,所有的环境变量都是系统的全局变量。
环境变量可以在命令行中创建,但是当用户退出命令行时这些变量将会丢失,如果需要永久保存环境变量,
那么就可以在用户家目录下的.bash_profile 或者 .bashrc 按照系统的规范在设置环境变量时所有的环境变量名采用大写的方式;

   环境变量按生存周期来划分:
   1.环境变量永久变量:需要修改配置文件如:/etc/profile文件或者/etc/profile.d目下的文件中声明的,还有一个就是在用户家目录下的.bash_profile和.bashrc文件。
   2.环境变量临时变量:使用export命令声明即可,变量在关闭shell时失效。
   定义好了变量文件,修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。

 
(2)普通变量(局部变量)
局部变量只能在创建它的shell脚本和函数中使用,如果在shell中启动另一个进程或退出,这个局部变量也将无效。
普通变量定义,变量名由字母开头,后面可以接下划线和数字
1.变量名=value     一般定义数字时使用,连续的字符串,如果不是连续的有空格的,就要用双引号。
2.变量名='value'   原样输出,不解析。
3.变量名="value"   双引号内可以有变量,输出变量时双引号内的变量会经过解析后,输出该变量的内容。

1.例:
a=172.16.70.71
a=172.16.70.71-$a
b='172.16.70.71-$a'
c="172.16.70.71-$a"

echo "a=$a"
echo "b=$b"
echo "c=$c"

输出结果:
[root@computer1 ~]# echo "a=$a"
a=172.16.70.71-172.16.70.71
[root@computer1 ~]# echo "b=$b"
b=172.16.70.71-$a
[root@computer1 ~]# echo "c=$c"
c=172.16.70.71-172.16.70.71-172.16.70.71
[root@computer1 ~]# 

2.例:
执行linux命令,用反引号``引起来.
echo "`date`"

Mon Jun  4 15:42:43 CST 2018


(3)查看环境变量
env命令:输出当前用户的变量;
set命令:输出全部的变量;
export命令:输出导出的全局变量;
declare命令:输出全部的变量、函数、整数和已经导出的变量;
linux 分 shell变量(set),用户变量(env), shell变量包含用户变量,export是一种命令工具,是显示那些通过export命令把shell变量中包含的用户变量导入给用户变量的那些变量.


(4)自定义环境变量
1)设置环境变量
增加一个环境变量TEST。
1. export TEST="hello world"  或者先定义TEST="hello world" ;再导出export TEST (一次可以导出多个)
2. declare -x TEST="hello world"

2)取消环境变量
unset命令来清除环境变量,注意set,env,export设置的变量,都可以用unset来清除。
删除一个环境变量TEST,清除环境变量的值用命令。如果未指定值,则该变量值将被设为NULL。
unset TEST 

查找TEST环境变量,没有输出证明环境变量TEST已经删除
env|grep TEST 

    
(5)系统内置的常用变量

$BASH BASH的二进制文件问的路径
$BASH_ENV BASH的启动文件
$BASH_VERSINFO[n] BASH版本信息,有六个元素
$BASH_VERSION BASH版本号
$EDITOR 脚本所调用的默认编辑器
$EUID 当前有效的用户ID
$FUNCNAME 当前函数名
$GROUPS 当前用户所属组
$HOME 当前用户家目录
$HOSTTYPE 主机类型
$LINENO 当前行号
$OSTYPE 操作系统类型
$PATH PATH路径
$PPID 当前shell进程的父进程ID

$PWD 当前工作目录
$SECONDS 当前脚本运行秒数
$TMOUT 不为0时,超过指定的秒将退出shell
$UID 当前用户ID

(6)shell的特殊变量

$0 当前脚本的名字
$n 传递给脚本或者函数的参数,n表示第几个参数,从第1个参数开始
$# 传递给脚本或函数的参数个数

$* 传递给脚本或函数的所有参数
$@ 传递给脚本或者函数的所有参数
$$ 当前shell脚本进程的PID

$? 函数返回值,或者上个命令的退出状态

1)$?用于判断上一个命令是否执行成功,如果成功为0。

返回值 含义
0 表示运行成功
2 权限拒绝
1~125 运行失败,脚本命令、系统命令错误或参数传递错误
126 找到命令但是无法执行
127 未找到要运行的命令
>128 命令被系统强制结束

2)$0当执行脚本是全路径的时候,$0也会带路径
些时可以用dirname和basename将$0中的路径和名称分别取出来
vim /root/test003.sh
#!/bin/bash
dirname $0
basename $0


再用全路径执行该脚本:
[root@computer1 ~]# sh /root/test003.sh 
/root
test003.sh

dirname和basename命令可以直接输出路径和名称:
[root@computer1 ~]# dirname /var/log/messages
/var/log
[root@computer1 ~]# basename  /var/log/messages
messages


(7)$* 和 $@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时:
"$*" :会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;

"$@" :会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 

$* 将命令行所有参数视为单个字符串,等同于"$1$2$3"
$@ 将命令行每个参数视为单独的字符串,相当于"$1""$2""$3"。这种方式会保留所有内嵌在参数的任何白,都能传递给其它程序。


set -- "who are " your me #set命令传入参数
1.)$*不加引号
[root@compute1 ~]# for i in $*;do echo $i;done 
who
are
your

me

2.)“$*”$*加引号
[root@compute1 ~]# for i in "$*";do echo $i;done                    
who are your me

3.)$@不加引号
[root@compute1 ~]# for i in $@;do echo $i;done
who
are
your
me

4.)"$@" $@加引号
[root@compute1 ~]# for i in "$@";do echo $i;done 
who are
your
me

(8)变量取值
有4种方式:
1.$NAME
2.${NAME}
3.$"NAME"
4."${NAME}"

newdate=$(date +%F)
花括号取变量时如:tar zcf message_$newdate_http.tar.gz
此时shell产生歧义,将$newdate_http 整体看成了变量,所以这时要用大括号如:
将/var/log/下所有文件和目录打包
tar zcvf messages_${newdate}_log.tar.gz /var/log/

tar zcvf messages_`uname -n`_log.tar.gz /var/log/

(9)将命令定义为变量

1.用反引号: 
[root@computer1 ~]#newcmd=`ls`
[root@computer1 ~]# echo $newcmd
anaconda-ks.cfg cobbler.ks ks-post.log ks-post-nochroot.log ks-pre.log linux-auto-init.sh 

2.用$+圆括号:(推荐)
[root@computer1 ~]# newcmd=$(date)
[root@computer1 ~]# echo $newcmd  
Mon Jun 4 15:51:32 CST 2018


(10)例子详解
runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 

1.)直接输入runlevel 
N 3
得到2个参数,其中3就是当前运行级别

2.)set -- $(runlevel) 就是将runlevel运行的结果: N 3做为参数

3. )eval "echo \$$#" ,其中$#就是求出上面的参数的个数,刚才为2个,即$2取的值就是3
   eval二次扫描,首先扫描到echo输出$2,第二次解析$2的值为等级3


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux shell编程(三)shell脚本中的特殊变量详解 的相关文章

  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh

随机推荐

  • 通关6级之词汇(2021.05.29)

    前言 这篇词汇是通关6级系列第一篇文章 这篇文章和4级有大部分内容是一样的 所以如果学了4级的课程再学这个会很轻松 更多相关文章点击阅读 通关4级之阅读理解 通关4级之听力 通关4级之写作 通关4级之翻译 通关4级之词汇 通关6级之词汇 点
  • STM32 ST-LINK Utility程序烧录方法

    打开软件过后点击Target connect 出现以下界面表示STlink链接成功 如果出现没有检测到stlink的话 首先查看是否安装驱动程序 再重新插拔电脑usb口的stlink连接线 或者链接到主机后方的usb口 再重复以上步骤链接
  • Fire Net

    点击打开链接 Problem Description Suppose that we have a square city with straight streets A map of a city is a square board wi
  • 利用python对b站某GPT-4解说视频的近万条弹幕进行爬取、数据挖掘、数据分析、弹幕数量预测及情绪分类

    目录 一 利用Python爬取弹幕 二 利用几行代码直接生成词云 三 将弹幕属性和内容放入mysql当中 四 分析弹幕在视频各节点的数量 1 分析视频各个片段出现的弹幕数量 2 分析视频各大章节出现的弹幕数量 3 分析视频各小节出现的弹幕数
  • Learning Java language Fundamentals

    Chapter 2 Learning Java language fundamentals exercises 1 What is Unicode Unicode is a computing industry standard for c
  • 炒股新手技巧

    技巧一 关于止损和止赢的问题 我觉得很重要 止赢和止损的设置对股民来说尤为重要 有很多散户会设立止损 但是不会止赢 今天有必要和大家探讨一下 止损的设立大家都知道 设定一个固定的亏损率 到达位置严格执行 但是止赢 一般的散户都不会 为什么说
  • 用mybatis批处理, 编程式事务,CompletableFuture异步处理,多线程,线程池,list 分页,实现多张表大批量插入

    目录 概述 准备工作 创建数据库表 创建Java实体类 创建MyBatis映射文件和DAO接口 编写Java代码实现多张表大批量插入的功能 总结 1 概述 在实际的开发中 我们经常需要将大量的数据插入到数据库中 如果使用单条插入的方式 会导
  • vs2017 找不到源文件stdio.h解决方法

    这个问题网上又不少人提出 我的vs出现这个问题是因为我电脑重装系统了 原来的项目所采用windows SDK 已经发生了变化 因此解决的办法是 项目 gt 属性 gt 配置属性 gt 常规 gt windows SDK版本 将其换成你现在的
  • 【论文阅读】【因果关系】

    文章目录 因果理论的三个层级 张含望 因果推理在计算机视觉中的进展 浙江大学助理教授况琨 因果推理和稳定学习 因果理论的三个层级 该篇是本人入门因果 CV的随笔 期间会借鉴记录别人的理解 引用的部分会给出原始连接 如有侵权请联系我删除 Ju
  • EEPROM AT24C08的操作

    EEPROM应该是学习IIC总线时候最先接触的东西了 EEPROM的优点是可以随机存取 不像Flash存储器一样需要先擦除在能写入 而且擦写次数多存储时间长 但是缺点是存储空间非常有限 像我这用的Atmel的AT24C08只有8Kbit的存
  • Java异常机制Throwable

    Java中异常的概念以及处理异常 在Java程序运行期间出现了一个错误 这个错误可能是由于文件包含了错误信息 或者是由于网络连接出现问题 也可以是因为使用了无效的数组下标 或者是试图使用一个没有被赋值的对象引用而造成的 我们称这样的错误为异
  • canvas 简单用法

    canvas使用方法 1 首先要获取页面中的画布 var canvas document querySelector canvas 2 创建画笔 var context canvas getContext 2d 3 选择要绘画的方式 进行绘
  • Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程

    PEM文件有以下格式 PEM私钥文件格式 BEGIN RSA PRIVATE KEY END RSA PRIVATE KEY 生成该密钥的Linux命令 OpenSSL gt genrsa out privateKey pem 1024 读
  • 100天精通Python(基础篇)——第2天:注释

    文章目录 一 注释的作用 二 单行注释如何定义 三 多行注释 一 注释的作用 1 注释是代码中的解释型语句 用来对代码内容进行注释 2 注释不是代码 不会被程序执行 二 单行注释如何定义 通过 号定义 建议在 和注释内容之间 间隔一个空格
  • 锚点

    在制作网页时 我们常常遇到需要添加侧边导航 通过点击导航让页面自动滚动到指定位置 如 电商网站的楼层 这就涉及到 a 标签的锚点应用 把它称为 锚点标签 一 锚点 我们想要让页面跳转到的位置 就是锚点 锚点是一种超链接 只不过它是页面内部的
  • 使用Html做一个简单的登陆页面

    目录 绪论 一 新建一个html项目 二 制作整体框架 三 使用CSS进行修饰 绪论 html作为一个常用的前端语言 使用的人群范围是很大的 如果你想要成为一个前端工程师 那必不可少的就要做一个登陆页面 登录页面一般就是账号和密码 另外还需
  • 一文读懂:什么是RFID

    在物联网领域 我们经常听到 RFID 这个词 接下来讲解一下 什么是 RFID 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 RFID 全称为 Radio Frequency Identification 中文称 射频识别
  • VRRP与DHCP

    目录 一 VRRP 1 VRRP基本概述 2 VRRP基本机构 3 设备类型 4 工作原理 5 VRRP主备备份过程 二 DHCP 1 应用场景 2 工作原理 一 VRRP 1 VRRP基本概述 VRRP 虚拟路由器冗余协议 VRRP能够在
  • 软件架构之架构视图

    软件架构设计运用RUP4 1视图方法进行设计 4 1架构视图模型是1995年Philippe kruchen在 IEEE software 上发表的题为 The 4 1 View Model of Architecture 文 主要包括的架
  • Linux shell编程(三)shell脚本中的特殊变量详解

    1 环境变量 全局变量 环境变量一般使用export内置命令导出的变量 用于定义shell运行环境 保证shell命令能够正确执行 shell通过环境变量来确定登录的用户名等信息 所有的环境变量都是系统的全局变量 环境变量可以在命令行中创建