eval如何使用?

eval如何使用?

[amuse@ca*ca* ~]$ cat ok.bash
ok1="ls"
ok2="-l"
$ok1 $ok2
eval $ok1 $ok2
在这个脚本中, eval起的作用与上一个语句相同,eval还有什么特殊的用途吗?      
eval是动态语言特有的,能够执行一个字符串。
只要是动态语言就有eval      
有详细的例子吗?      
给个例子, 个中滋味就自己先品一品吧
引用:
-(dearvoid@LinuxEden:Forum)-(~/void/bash)-
[$$=17253 $?=0] ; cat colorize.sh
#!/bin/bash
#
# Author: Clark J. Wang <dearvoid at gmail.com>
#
#--------------------------------------------------------------------#
#
# Usage: colorize [-n] COLOR TEXT
#
# If -n is specified, the trailing newline is suppressed.
#
function colorize()
{
    local bNewLine=1 sNewLineOpt
    local sClr aValidClrs bValidClr=0
    local sClrName sText

    local default=$'\033[0m'
    local   black=$'\033[0;30m'
    local    Gray=$'\033[1;30m'
    local     red=$'\033[0;31m'
    local     Red=$'\033[1;31m'
    local   green=$'\033[0;32m'
    local   Green=$'\033[1;32m'
    local   brown=$'\033[0;33m'
    local  yellow=$'\033[1;33m'
    local    blue=$'\033[0;34m'
    local    Blue=$'\033[1;34m'
    local  purple=$'\033[0;35m'
    local  Purple=$'\033[1;35m'
    local    cyan=$'\033[0;36m'
    local    Cyan=$'\033[1;36m'
    local    gray=$'\033[0;37m'
    local   white=$'\033[1;37m'

    aValidClrs=(black white red Red green Green brown yellow blue Blue \
                purple Purple cyan Cyan gray Gray default)

    if [ $# = 3 ]; then
        if [ "$1" = '-n' ]; then
            bNewLine=0
            sNewLineOpt='-n'
        else
            echo "Error: usage error" 1>&2
            return 1
        fi

        shift
    elif [ $# != 2 ]; then
        echo "Error: usage error" 1>&2
        return 1
    fi
    sClrName=$1
    sText=$2

    for sClr in ${aValidClrs[@]}; do
        if [ "$sClr" = "$sClrName" ]; then
            bValidClr=1
        fi
    done

    if ((bValidClr)); then
        eval "echo $sNewLineOpt \"\$$sClrName\$sText\$default\""
    else
        echo "Error: invalid color name \`$sClrName'" 1>&2
        return 1
    fi
}

#-- main ------------------------------------------------------------#

colorize "$@"
-(dearvoid@LinuxEden:Forum)-(~/void/bash)-
[$$=17253 $?=0] ; ./colorize.sh red 'This is red'
This is red
-(dearvoid@LinuxEden:Forum)-(~/void/bash)-
[$$=17253 $?=0] ; ./colorize.sh purple 'This is purple'
This is purple
-(dearvoid@LinuxEden:Forum)-(~/void/bash)-
[$$=17253 $?=0] ; bye
      
十分感谢,下载后认真研究.      
为何使用eval 和不使用eval的结果不同?
[amuse@ca*ca* ~]$ cat ok.bash
unamer=$(uname -r)
version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo $version
unamer=$(uname -r)
eval version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo $version
[amuse@ca*ca* ~]$ ./ok.bash
(2 6)
2
结果有差异,为什么?      
复制内容到剪贴板
代码:
unamer=$(uname -r)
version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo $version
unamer=$(uname -r)
eval version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo ${version[*]}
eval返回的是数组

      
复制内容到剪贴板
代码:
unamer=$(uname -r)
version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo ${#version}
unamer=$(uname -r)
eval version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
echo ${version[*]}
第一个返回的是字符串      
引用:
eval version=$(echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }')
做了一次数组转换

执行的是 eval version=(2 6)
当然version 是数组了

      
我又学一边bash,我分析的对不