linux命令等号 linux命令星号( 四 )


这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少 。
echo "$#"
一般来说,UNIX(linux) 系统的进程以执行系统调用exit()来结束的 。这个回传值就是status值 。回传给父进程 , 用来检查子进程的执行状态 。
一般指令程序倘若执行成功 , 其回传值为 0;失败为 1 。
tar cvfz dfbackup.tar.gz /home/user/dev/nullecho"$?"
由于进程的ID是唯一的 , 所以在同一个时间 , 不可能有重复性的PID 。有时 , script会需要产生临时文件,用来存放必要的资料 。而此script亦有可能在同一时间被使用者们使用 。在这种情况下 , 固定文件名在写法上就显的不可靠 。唯有产生动态文件名 , 才能符合需要 。符号
或许可以符合这种需求 。它代表当前shell 的 PID 。
echo "$HOSTNAME, $USER, $MAIL"ftmp.$$
使用它来作为文件名的一部份,可以避免在同一时间 , 产生相同文件名的覆盖现象 。
ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用 。所以 script 即使临时文件是使用动态档名的写法,如果script 执行完毕后仍不加以清除 , 会产生其他问题 。
( ) 指令群组 (command group)
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组 。如下面的例子:(cd ~ ; vcgh=`pwd` ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令 。因此,在其中所定义的变数 , 仅作用于指令群组本身 。我们来看个例子
# cat ftmp-01#!/bin/basha=fsh(a=incg ; echo -e "\n $a \n")echo $a#./ftmp-01incgfsh
除了上述的指令群组,括号也用在 array 变数的定义上;另外也应用在其他可能需要加上escape字元才能使用的场合,如运算式 。
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能 。所以,在执行效率上会比使用 let指令要好许多 。
#!/bin/bash(( a = 10 ))echo -e "inital value, a = $a\n"(( a++))echo "after a++, a = $a"
有时候 script 当中会出现 , 大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定 。
# cat ftmp-02#!/bin/basha=fsh{a=inbc ; echo -e "\n $a \n"}echo $a#./ftmp-02inbcinbc
这种用法与上面介绍的指令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell 。
大括号也被运用在 "函数" 的功能上 。广义地说,单纯只使用大括号时 , 作用就像是个没有指定名称的函数一般 。因此,这样写 script也是相当好的一件事 。尤其对输出输入的重导向上,这个做法可精简 script 的复杂度 。
此外,大括号还有另一种用法,如下
{xx,yy,zz,...}
这种大括号的组合,常用在字串的组合上,来看个例子
mkdir {userA,userB,userC}-{home,bin,data}
我们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data,这几个目录 。这组符号在适用性上相当广泛 。能加以善用的话,回报是精简与效率 。像下面的例子
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
如果不是因为支援这种用法 , 我们得写几行重复几次呀!
常出现在流程控制中 , 扮演括住判断式的作用 。if [ "$?" != 0 ]thenecho "Executes error"exit1fi
这个符号在正则表达式中担任类似 "范围" 或 "集合" 的角色
rm -r 200[1234]
上例 , 代表删除 2001, 2002, 2003, 2004 等目录的意思 。
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与 逻辑等符号 。
#!/bin/bashread akif [[ak5 || ak 9 ]]thenecho $akfi

推荐阅读