玩转Bash脚本:特殊变量

总第4篇

在前面博文中我讲过了变量基础部分《变量基本概念及其初始化》。我们知道假如我们有初始化一个变量a=hello,那么如果我们想打印它的值,我们需要使用echo $a。

但是除此之外还有很多特殊的变量,可供 $ 使用。本文讲到了$0 # * @ _ ? ! -这几个特殊变量的含义。

脚本的参数

正如同C语言中有main(int argc,char **argv),Java中有main(String[]args)一样,Bash同样能对执行脚本时附加的参数做操作。

引用脚本的参数n

看一个简单的脚本test.sh

#!/bin/bash
echo $0 $1 $2 $3

然后看一下我的屏幕输出情况。

没错,和你想的一样。数字变量0,保存的是这个执行脚本的名称,其他的数字1到n保存该脚本运行时的第1到第n个参数。

如果没有脚本在运行,比如直接在终端中键入echo $0,那么显示的是shell的名称。

参数的个数#

现在我们继续修改一下test.sh这个脚本

#!/bin/bash
echo "脚本$0的参数的个数为$#"
echo "分别是:"
echo $1 $2 $3 

输出的结果是:

#号代表参数的个数,实际上在Bash中#代表个数的情况,并无只此一例,以后我们在讲字符串操作的时候还会见到。

所有的参数*和@

继续修改脚本

#!/bin/bash
echo "脚本$0的参数的个数为$#"
echo "分别是:"
echo [email protected]
echo $* 

试试。

没错@,* 就是所有变量。从这里来看似乎两者没有差别。但是其实是不同的,通配符*将所有参数视作一个变量,而@则可以理解为所有参数的集合。

看一个长一点的脚本,star_at.sh(代表着star*和[email protected])

关于for循环,你可能还不理解,但是并没有关系,这里仅仅是简单的遍历。

#!/bin/bash
echo $*
echo [email protected]
echo "遍历不带引号的变量*"
for i in $*
do
    echo $i
done
echo "遍历带引号的变量*"
for i in "$*"
do
    echo $i
done
echo "遍历不带引号的变量@"
for i in [email protected]
do
    echo $i
done
echo "遍历带引号的变量@"
for i in "[email protected]"
do
    echo $i
done

看出来了没,当遍历的时候,可以发现,如果[email protected],$*都没有被引号包围,那么两者没有差别。但是如果有了引号,则不同。可以发现$*其实只是一个值而已。

最后一个参数_

$_保存的是命令(或脚本)的最后一个参数。

#!/bin/bash
echo "脚本$0的参数的个数为$#"
echo "分别是:"
echo [email protected]
echo "最后一个参数是$_"

输出结果是:

其他特殊变量

退出码?

当我们执行完一个命令的时候,都可以用 echo $? 来查看命令的退出码 exit code(或称返回码),从而判断命令是否正确执行。可以理解为命令的返回值(后面我们学到Bash函数的时候,也会用它来做返回值),但是与其他语言不同的是它只是一个固定的8位二进制数,也就是说它的范围是0-255。并没有其他语言中返回值那么丰富的功能。所以我个人喜欢称之为
而不是 值。(当然这不是重点)

上面是个简单的例子,用which检查某个命令是否存在,通过返回值可以了解。0代表成功,非0代表不成功。这可能与其他语言的思想相悖,但是也可以理解,毕竟成功的状态只有一个,而错误的情况却有许多种,所以用正数来标记错误状态。

不过通常在脚本内部,我一般不会直接用到$?来判断一个命令的返回值,if [  ]就差不多了。

当前进程的PID $

echo $$可以打印当前进程的PID(PID是什么,我就不解释了)。继续修改test.sh,你只需要关注最后一句就可以了。

#!/bin/bash
echo "脚本$0的参数的个数为$#"
echo "分别是:"
echo [email protected]
echo "最后一个参数是$_"
echo "当前进程的PID为$$"

输出结果是:

后台执行的最后一个命令的PID !

shell执行命令的时候有前台和后台的概念。一直和你交互的就是前台,但是有些命令会阻塞进程,导致你无法输入其他命令。比如在终端里打开了一个图形编辑器gedit或者火狐浏览器的时候。不过我们可以通过在命令后面加一个&,来把它丢到后台,比如 gedit &,这样就不会阻塞前台进程,你可以继续输入其他命令。

我喜欢在终端启动浏览器,现在我们来试试$!,是不是可以查看它的PID。

关于 >/deb/null 2>&1这部分会在以后输入输出重定向的时候讲到。它的功能是把火狐的各种终端输出丢进垃圾桶,不在屏幕上显示。

当前shell的默认选项 -

himBH是Bash的当然的默认选项,可以使用set -o打开某一选项,或者set +o来关闭某一选项。关于这几个选项的含义,超出本文叙述范围,超纲内容请同学们自行

  • man bash
  • /-h
  • /-i
  • /-m
  • /-B
  • /-H

来查看

时间: 2024-07-30 06:19:19

玩转Bash脚本:特殊变量的相关文章

玩转Bash脚本:变量基本概念及其初始化

总第2篇 基本概念 命名 注意以下规则: 只能包含字母.数字和下划线,并且不能以数字开头 大小写敏感 不能和系统变量重名 除此以外,如果要导出为全局变量,名称最好要全部大写.这只是一种习惯的约定,并非严格的约束. 类型 几乎所有的编程语言都有变量的概念,Bash当然也不例外.说道变量就少不了说一说类型.但与其他语言不同的是Bash属于无类型语言,如果强要说一种类型,可以认为都是字符串.说到这里,你可能会说,Bash里面也有整数类型吧,好像有整数的运算.但其是通过一些运算符,表达式或者命令将字符串

玩转Bash脚本:选择结构之case

总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,case在bash中的地位,和switch在C中的地位一样. 可是使用方法可大有不同. 代码块 不论什么语言都有代码块的概念,C语言中的花括号{ },python中的冒号和缩进.bash中的代码块风格不是非常统一.可是在选择结构中是同样的--反语.if结构使用if...fi标识一个代码块的作用域,而ca

玩转Bash脚本:循环结构之while循环

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

玩转Bash脚本:循环结构之while循环(转)

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

bash脚本的变量使用详解

变量的类型包括整数.字符串和数组,但在bash脚本编程中不需要指定类型就可以直接赋值,默认均为字符型,其参与运算会自动进行隐式类型转换. 变量的赋值方式为:name='value',其中"="两边一定不能有空格,如果变量值中包含有空格则需要使用引号引起来,需要注意的是强引用和弱引用的区分.此外变量的赋值也可以引用变量和命令,如果引用变量赋值需要使用双引号,如果引用命令赋值需要使用反向单引号.变量的引用需要使用"$"符号,如引用变量PATH:$PATH 或 ${PAT

玩转Bash脚本:数值计算

总第6篇 Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2. 为了解决这一问题,有如下几种方案. 运算符[ ] a=2 b=3 c=$[a+b] d=$[a-b] e=$[a*b] f=$[a/b] g=$[a%b] $符只是取变量值的意思.中括号和里面的表达式可以视作一个变量.在中括号中引用变量可以直接使用变量名,也可以使用$加变量名.比如: c=$[$a+$b] 当然,你可以直接使用字面值: c=$[2+3] d

Bash脚本编程变量浅谈

Bash(GNU Bourne-Again Shell)是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell. Bash脚本编程的变量: 1.$BASH 表示的是Bash的二进制程序文件的路径 eg:编辑bash文件例如1.sh,在其中输入如下代码: 然后保存运行,就会出现bash脚本解释器的路径. 2.$FUNCNAME 表示的是当前函数的名字 eg:编辑bash文件2.sh,在其中输入如下代码: 运行该bash文件结果如下: $FUNCNAME作用于函数体

玩转Bash脚本:循环结构之for循环

总第7篇 for循环 基本格式 for 变量 in 取值列表 do 各种操作 done 还有罕见的写法就是都写作一行里: for 变量 in 取值列表 ; do 各种操作 ;done 取值列表大致可以分成枚举和迭代两类 枚举 普通枚举 取值列表为空格或回车符分割的字符串 for i in 'apple' 'meat' 'sleep' 'woman' do echo I like $i done 在终端执行该脚本for.sh.运行结果 [email protected]:~$ bash for.s

bash脚本编程 变量 一

bash变量类型 环境变量 本地变量(局部变量) 位置变量 特殊变量 本地变量: VARNAME=VALOE:作用域为整个bash进程 局部变量: local VARNAME=VALOE:作用域为当前代码段 环境变量: 类似于本地变量:作用域为当前shell进程及其子进程 export VARNAME=VALOE 位置变量: $1  $2表示 特殊变量: $?:上一个命令的执行状态返回值 程序执行,有两类可能的返回值: 1.程序执行结果 2.程序状态返回代码(0-255) 0:表示正确执行 1-