網路農夫 --  Home 網路農夫 --  Home
網路農夫 --  Home
wait.....

3-8-11 eval 指令

指令語法 eval argument ...

內建指令 eval 的功能是將引數(argument)讀入 C shell 中,然後在加以執行。在 C shell 程式設計運用上,比較常看見。讓我們先來看下面的情況:

6 % set vcom = 'ls -l ; date'
7 % $vcom
; not found
date not found

在指令 6,設定變數 vcom 為 'ls -l ; date'。當我們用變數的形態來執行“$vocm”,卻發現有兩個錯誤訊息,告訴我們“; not found”及“date not found”。會造成這種錯誤的原因,是因為 C shell 對於這種變數的解析語法,無法辨視特殊符號所造成的。如上例的變數,符號“;”與指令 date 均 C shell 被誤解成是指令 ls -l 後得“檔案名稱”。所以才會有“not found”的訊息傳出。

內建指令 eval 便是用來應付這種情況。我們將上面的變數改用 eval 來執行:

8 % eval $vcom
total 1
-r--r--r-- 1 akira 1296 Oct 12 07:29 search.c
Tue Oct 18 12:13:53 CST 1994

由於指令 eval 將 $vcom 當成引數讀入再加以執行,所以“not found”的誤解情況便消失了。其實在作法上使用指令 eval 便相當於以下的用法:

9 % echo $vcom | csh
total 1
-r--r--r-- 1 akira 1296 Oct 12 07:29 search.c
Tue Oct 18 12:13:54 CST 1994

如果你是在 C shell 程式設計裡運用的話,你也可應用以下的方式:

/bin/csh << EOF
$vcom
EOF

不過這些變通的方法都不如使用內建指令 eval 來的方便。另外在使用內建指令 eval 上也有相當多的技巧,讓我們來看一個變數互換的技巧:

% set a = '$b'
% set b = 'swapping'
% echo $a
$b
%eval echo $a
swapping

在上例中,變數 a 的內容是“$b”,當我們以一般的 echo 指令執行時,我們發現僅是將變數的內容顯示螢幕罷了。但是,當我們以指令 eval 來執行該 echo 指令時,卻輸出變數 b 的內容。相信你已經知道要如何運用了吧!

對於這個內建指令,在這裡要告訴你一個比較不好的消息,就是如果你所使用的 UNIX 作業系統是 SUN OS 4.1.3 的話,它有存在不少 bug,使用上請多多小心。

 

版本:Beta-2001-05 -- 網路農夫