1. “:” 命令
Shell命令总是有一些奇怪的命令符,比如之前看到的“[”;这里又来了一个。你没有看错,“:”这货也是有特殊含义的。
在shell中 “:”是true的别名,就是表示真,如以下代码:
#!/bin/bash
if : # 有木有看到
then
echo ": is true"
fi
if true
then
echo "true is true"
fi
就是这样的了,由于“:”是内置命令,所以它的运行速度比true快。
2. eval命令
eval命令允许对参数进行求值,它的格式如下:
eval [arg ...]
把参数当做一个Shell命令来执行。这是对eval最简单的解释了。eval命令会将参数连接为一个整的字符串,然后将这个字符串作为一个新的Shell输入进行执行。
当我们将一些字符串作为eval的参数时,Shell在执行整个eval命令时,它会对eval命令的参数进行两次扫描。例如以下示例代码:
#!/bin/bash
a=10
x=a
eval y='$'$x
echo $y
exit 0
在eval执行的过程中,先对y='$'$x进行第一次扫描,得到y=$a;然后再进行第二次扫描,也就是执行y=$a,得到了y=10;当执行echo $y的时候,就输出结果10。
3. exit n命令
exit命令使脚本以退出码n结束运行。如果允许自己的脚本程序在退出时不指定一个退出状态,那么该脚本中最后一条被执行命令的状态将被用作为返回值。在脚本程序中提供一个退出码总是一个良好的习惯。
在Shell脚本编程中,退出码0表示成功,退出码1~125是脚本程序可以使用的错误代码。其余数字具有保留的含义,具体请Google。
可以使用$? 来读取shell的退出码
注意:$?只能用一次,第二次再用$?时结果就是上次$?的返回值,其实就是0
4. expr命令
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。以下通过实际的简单代码来看看expr的使用。
#!/bin/bash
# 获取字符串的长度
expr length "http://www.jellythink.com"
#截取子串
expr substr "http://www.jellythink.com" 12 21
#整数运算
var=`expr 10 / 2`
echo $var
var=$(expr 10 \* 2)
echo $var
exit 0
在上面的脚本中,使用了反引号(`),使用了该引号,就可以使expr的执行结果赋值给var变量,当然了,我们在脚本中也看到了$()来替换反引号的用法,这都是可以的。
expr命令的功能比较简单、单一,但是很强大。但是需要注意的是,在进行乘法运算时,如果写成:
expr 10 * 2
这样就会报错,这是由于*号在Shell有特殊意义,我们需要加上转义字符\。
5. set命令
set命令作用主要是显示系统中已经存在的shell变量,以及为已经存在的shell变量设定新的值。使用set更改shell特性时,符号”+”和”-“的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。
当使用set命令不带任何参数时,它会输出系统中已经存在的所有Shell变量;我们可以使用set设置我们本地的Shell变量,当退出Shell时,这些本地的Shell变量就会失效,如果需要永久的保存这些Shell变量,则需要写入配置文件中。
6. return命令
return命令的作用是使函数返回。return命令有一个数值参数,这个参数在调用该函数的脚本程序中被看做是该函数的返回值;如果没有指定参数,return命令默认返回最后一条命令的退出码。
7. shift命令
shift命令把所有参数变量左移一个位置,使2变成1,3变成2,以此类推;而2占领1的位置之后,原来$1的值就会被丢弃。
在扫描处理脚本程序的时候,经常要用到shift命令。如果你的脚本命令程序需要10个或10个以上的参数,我们就需要使用shift命令来访问第十个及其后面的参数。
8. trap命令
trap命令用于指定在接收到信号后将要采取的行动。trap命令的一种常见用途是在脚本程序中断时完成清理工作。在Linux系统中定义了许多信号,它们被定在头文件signal.h中,在使用信号名时需要省略SIG前缀。我们在命令行下可以使用trap -l查看所有的信号量定义,及其对应的数字。
trap有两个参数,第一个参数是接收到指定信号时将要采取的行动,第二个参数是要处理的信号名。格式如下:
trap command signal
下面就通过一个简单的实例来学习一下trap命令的使用,代码如下:
# !/bin/bash
# 当按下ctrl+c触发中断信号以后,就删除临时文件
trap 'rm -f /tmp/my_tmp_file_$$' INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "Press interrupt (ctrl + c) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]
do
echo file exists
sleep 1
done
echo file is no longer exists
#取消INT信号对应的处理
trap INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "Press interrupt (ctrl + c) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]
do
echo file exists
sleep 1
done
echo I never get here
exit 0
当按下ctrl + c组合键时,就会触发INT中断,然后就会删除创建的临时文件。
9. unset命令
unset命令的作用是从环境中删除变量或函数,这个命令不能删除shell本身定义的只读变量。
10. 命令的执行
我们在编写脚本的时候,经常需要捕获一条命令的执行结果,然后将这个结果保存在另一个变量中。在总结expr命令时,说到可以使用`符号。是的,不错,使用反引号确实可以完成,但是我们更建议使用$(command)来完成这项工作。
$(command)的结果就是其中命令的输出。注意,这不是该命令的退出状态,而是它的字符串形式的输出结果。比如以下脚本代码:
x=$(date)
echo $x
我们将date命令的输出结果保存在x变量中,然后就可以输出对应的结果。
这种把命令的执行结果存储到变量中的功能是巨大的,它使得在脚本程序中使用现有命令并捕获其输出变得很容易;这样我们可以配合xargs命令,将标准输出作为另一个程序的参数。