1.命令代换
在shell脚本语言中有两种命令代换方式
1>由反引号(`...`)括起来的也是⼀条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
DATE=`date`
echo $DATE
2>也可以使用 $() 代换
DATE=$(date)
示例:
两者间的区别和联系:
联系:均可用于命令代换
区别:1) Bash中的后置引用 `COMMAND`会将命令中的\\转义为\再执行,而$(COMMAND)则不会进行转义
2).$(...)形式的命令替换是允许嵌套的
在多层次的复合替换中,反引号须要额外的跳脱( \` )处理,而 $( ) 则比较直观。例如:
`cmd1`cmd2`` 你这么写就是错的。需要`cmd1\`cmd2\``如果有多个命令嵌套就比较复杂了。而用$()就比较直观比如$(cmd1$(cmd2$(cmd3)))
但是,$( ) 也是有缺点的
反引号 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。而 $() 并不见的每一种 shell 都能使用.
2.eval
1.eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
2.eval也可以用于回显简单变量,不一定时复杂变量。
NAME=ZONE
eval echo $NAME等价于echo $NAME
3.两次扫描
从echo $FILE可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令
4.获得最后一个参数
echo "Last argument is $(eval echo \$$#)"
在上面的脚本中,eval命令首先把$ $ #解析为当前shell的参数个数,然后在第二次扫描时得出最后一个参数。
4.给每个值一个变量名
可以给一个值一个变量名。假定有一个名为test2的文件:
你希望该文件中的第一列成为变量名,第二列成为该变量的值,这样就可以:
cat test2
COMMANY TQ
LANGUE ENGLISH
LIKE YES
#!/bin/bash
while read NAME VALUE
do
eval "${NAME}=${VALUE}"
done <test2
echo "$COMMANY $LANGUE $LIKE"
./test3
TQ ENGLISH YES