Shell特殊变量和命令行参数详解

1.shell变量基础

shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义。

所以若要进行数学运算,必须使用一些命令例如let、declare、expr、双括号等。

shell变量可分为两类:局部变量和环境变量。

局部变量只在创建它们的shell中可用;而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。

有些变量是用户创建的,其他的则是专用shell变量。

变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。

任何其他的字符都标志着变量名的终止。

名字是大小写敏感的。

给变量赋值时,等号周围不能有任何空白符。

为了给变量赋空值,可以在等号后跟一个换行符。

用set命令可以查看所有的变量,unset var命令可以清除变量var,var相当于没有定义过。readonly var可以把var变为只读变量,定义之后不能对var进行任何更改。

对shell变量的引用方式很多,用这些方式可以方便的获取shell变量的值,变量值的长度,变量的一个字串,变量被部分替换后的值等等。

shell变量常见引用方式如下:

2.环境变量

环境变量的定义方法如下:

var=value

export var

shell在初始化的时候会在执行profile等初始化脚本,脚本中定义了一些环境变量,这些变量会在创建子进程时传递给子进程。

用env命令可以查看当前的环境变量。常用的系统环境变量如下:

_(下划线):上一条命令的最后一个参数

BASH:展开为调用bash实例时使用的全路径名

CDPATH:cd命令的搜索路径。它是以冒号分隔的目录列表,shell通过它来搜索cd命令指定的目标目录。例如.:~:/usr

EDITOR:内置编辑器emacs、gmacs或vi的路径名

ENV:每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。

EUID:展开为在shell启动时被初始化的当前用户的有效ID

GROUPS:当前用户所属的组

HISTFILE:指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位,交互式shell退出时将不保存命令行历史

HISTSIZE:记录在命令行历史文件中的命令数。默认是500

HOME:主目录。未指定目录时,cd命令将转向该目录

IFS:内部字段分隔符,一般是空格符、制表符和换行符,用于由命令替换,循环结构中的表和读取的输入产生的词的字段划分

LANG:用来为没有以LC_开头的变量明确选取的种类确定locale类

OLDPWD:前一个工作目录

PATH:命令搜索路径。一个由冒号分隔的目录列表,shell用它来搜索命令,一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin

PPID:父进程的进程ID

PS1:主提示符串,默认值是$

PS2:次提示符串,默认值是>

PS3:与select命令一起使用的选择提示符串,默认值是#?

PS4:当开启追踪时使用的调试提示符串,默认值是+。追踪可以用set –x开启

PWD:当前工作目录。由cd设置

RANDOM:每次引用该变量,就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化。如果RANDOM被复位,即使随后再设置,它也将失去特定的属性

REPLY:当没有给read提供参数时设置

SHELL:当调用shell时,它扫描环境变量以寻找该名字。shell给PATH、PS1、PS2、MAILCHECK和IFS设置默认值。HOME和MAIL由login(1)设置

SHELLOPTS:包含一列开启的shell选项,比如braceexpand、hashall、monitor等

UID:展开为当前用户的用户ID,在shell启动时初始化

3.数值变量

shell中默认把变量值当作字符串,例如:


  1. age=22 
  2.  
  3. age=${age}+1 
  4.  
  5. echo ${age} 

输出结果为22+1,而不是23,因为shell将其解释为字符串,而不是数学运算。

可以用let命令使其进行数学运算,例如:


  1. let age=${age}+1 

也可以用declare把变量定义为整型。例如:


  1. declare -i age=22 

这里就用 -i 选项把age定义为整型的了。此后每次运算,都把age的右值识别为算术表达式或数字。

4.数组

在shell中可以使用数组,例如:


  1. array[0]=0 
  2.  
  3. array[1]=1 
  4.  
  5. array[2]=2 

则array就是一个数组,也可以这样给数组初始化:


  1. array=(0 1 2) // 元素之间以空格分隔 

可以通过 ${array[$i]}来访问array中某个元素,${array[*]} 的返回值即数组的所有元素组成的串,${#array[*]} 的返回值即数组的元素个数,${array[*]:0:2} 返回第一个和第二个元素组成的串。

0表示开始的位置,2表示要返回的元素个数,开始位置可以为0-2(0减去2)之类的,表示从倒数第二个元素开始。

下面写个稍微复杂点的例子:

如果要使用二维数组甚至三维数组该怎么实现呢,那就需要用eval命令来模拟数组的功能了。

eval命令的作用是扫描命令两次再执行,如果不使用eval,只扫描一次,然后执行。看个例子:


  1. root@suse:~$ name=Barry 
  2.  
  3. root@suse:~$ $name=hello 
  4.  
  5. Barry=hello: command not found 

为什么第二句给Barry变量赋值会出错呢?

从报错信息可以发现shell并没有识别这是个赋值语句,而是把Barry=hello当作一个命令来执行,当然会报错。

为什么不能识别这是赋值语句呢?

第一次扫描时,因为扫描到$符号,所以不能把这句当作赋值语句,赋值语句的左边总是一个变量名,而不应该是$开头的。

所以第一次扫描仅仅识别了$name变量,并做了替换,而并没有认识到赋值语句。

如果使用eval $name=hello呢?


  1. root@suse:~$ name=Barry 
  2.  
  3. root@suse:~$ $name=hello 
  4.  
  5. Barry=hello: command not found 
  6.  
  7. root@suse:~$ eval $name=hello 
  8.  
  9. root@suse:~$ echo $Barry 
  10.  
  11. hello 

可见使用了eval之后,对 $name=hello 第一次扫描替换了$name,没有识别赋值语句,第二次扫描识别是赋值语句,然后执行。

现在大约可以想到怎样用eval实现二维数组了。

下面实现的二维数组每一行代表一个人的信息记录,包括姓名,年龄。

5.特殊变量

$0:当前脚本的文件名

$num:num为从1开始的数字,$1是第一个参数,$2是第二个参数,${10}是第十个参数

$#:传入脚本的参数的个数

$*:所有的位置参数(作为单个字符串)

$@:所有的位置参数(每个都作为独立的字符串)。

$?:当前shell进程中,上一个命令的返回值,如果上一个命令成功执行则$?的值为0,否则为其他非零值,常用做if语句条件

$$:当前shell进程的pid

$!:后台运行的最后一个进程的pid

$-:显示shell使用的当前选项

$_:之前命令的最后一个参数

作者:云豆

来源:51CTO

时间: 2024-08-03 20:19:00

Shell特殊变量和命令行参数详解的相关文章

php 命令行参数详解及应用

命令行|详解 大家知道,php是一种PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页.当用户打开php页面时,服务端便执行PHP的命令并将执行结果发送至用户的浏览器中,这类似于ASP和CoildFusion,PHP可以运行在WINDOWS和多种版本的UNIX上.除了能够操作您的页面外,PHP还能发送HTTP的标题.您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析XML的任

PHP 命令行参数详解及应用_php技巧

复制代码 代码如下: # 不带参数的执行格式 php安装目录/bin/php scriptname.php # 带参数的执行格式 php安装目录/bin/php scriptname.php [参数1] [参数2] ..... 在scriptname.php通过$argv和$argc访问参数 # $argv(正式写法$_SERVER['argv'])数组保存着传递的全部参数,需要注意的是第一个参数$argv[0] / $_SERVER['argv'][0] 为执行脚本的名称如, scriptna

php命令行参数详解及应用PHP学习网

大家知道,php是一种PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页.当用户打开php页面时,服务端便执行PHP的命令并将执行结果发送至用户的浏览器中,这类似于ASP和CoildFusion,PHP可以运行在WINDOWS和多种版本的UNIX上.除了能够操作您的页面外,PHP还能发送HTTP的标题.您可以设置cookie,治理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析XML的任何事情.那你还

.NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源,如果采用物理文件作为配置源,我们可以选择不同的格式(比如XML.JSON和INI等) .如果这些默认支持的配置源形式还不能满足你的需求,我们还可以通过注册自定义ConfigurationSource的方式将其他形式数据作为我们的配置来源. [ 本文已经同

IBM Key Management工具(iKeyMan)脚本吃掉%*$*无法接收命令行参数之解

http://www.java2class.net/bbs/viewthread.php?tid=230   iKeyman工具是一个图形化用户界面的数字证书管理工具.通过它可以创建一个新的密钥库.测试数字证书.增加CA根到密钥库.从一个密钥库拷贝证书到另一个密钥库,以及从CA机构请求和接收数字证书.设置默认的密钥.更改密码等等. 但是由于IBM产品中所附带的脚本中对接收命令行的参数没有进行有效的处理,以致于想通过命令行进行传递定制的参数无法顺利进行. 对于AIX.Linux.Solaris可以

shell(bash)下“time” 命令的输出详解_linux shell

前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便.但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示在屏幕上,这对于非交互计时很不方便. 例如: $ time find . -name "mysql.sh" >1.txt real 0m0.081s user 0m0.060s sys 0m0.020s $ time find . -name &quo

Linux命令行管道详解

管道操作符"|", 可以把一个命令的标准输出(stdout), 送到另一个命令的标准输入(stdin)中. 过滤器(filter), 就是把多条命令合在一起构成一个管道. 主要命令: sort: 排序; uniq, UNIQue, 输出没有重复行的数据; 参数"-d", 可以输出重复行; wc, 单词统计(Word Count); 参数"-l", 只统计行; grep, 输出匹配模式, Global Regular Expression Prin

【Linux基础】 diff命令的参数详解和实例

diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, diff - - 比较一份标准输入的它自己的拷贝如果 源文件 是一个目录和 目标文件 不是(目录), diff 会比较在 源文件(目录) 里的文件的中和 目标文件同名的(文件), 反过来也一样. 非目录文件不能是 -. 如果 源文件 和 目标文件 都

在IIS上重新注册.NET Framework 2.0的命令和参数详解_实用技巧

我们有时可能需要将 .Net 重新注册到 IIS 上面,可以用下面的命令行来操作. 如果您电脑已经安装了 IIS 然后再装.net 在安装过程中 .net 是会自动帮您注册的,反之则需要注册. 打开程序-运行-cmd:输入一下命令重新注册IIS 复制代码 代码如下: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i 注册成功就可以在IIS里看到: 以下是aspnet_regiis.exe参数的说明信息: -i –