2014-01-16 106 views
1

我有這個KornShell(ksh)腳本。它只打印ab。我不確定爲什麼只印刷這兩個字母?Unix Shell腳本的非預期輸出

腳本:

#!/bin/ksh 
for i in [global] 
do 
     echo $i 
done 
exit 0 

輸出:

./a.sh 
a 
b 

我需要了解如何解釋外殼[全球]字。

+1

在哪裏[全球]定義的?當我輸入它時輸出[全球] –

+0

我期望打印[全球],它只是字符串 – sfgroups

+0

這就是我看到,當我運行它。你在運行什麼OS/Shell版本? –

回答

3

由於字符串[global]被shell視爲一個glob模式,並嘗試匹配當前目錄中來自字符集{a, b, g, l, o}的單字符名稱的任何文件。您在該目錄中有兩個文件,分別名爲ab。如果你想[global]被視爲一個字符串,然後添加一些報價:

for i in "[global]" 
do 
    echo "$i" 
done 

引用防止通配符。

+2

你在什麼版本的ksh和OS下觀察過這個?我已經完全運行了他所輸入的內容,並且收到了[global]作爲輸出.... @sfgroups是否有當前目錄中名爲a和b的文件? –

+1

@JamesGawron如果glob不匹配任何東西,它保持不變,所以如果你沒有一個名爲'a','b','g','l'或'o','echo'的文件[global]'實際上會打印字符串'[global]'。但是,如果你這樣做,模式將被替換爲匹配文件列表。這是'bash',但globbing(至少那個特殊的形式)在'ksh','csh'(shudder),'zsh'等中的工作方式幾乎相同......你可以驗證這個:'mkdir x ; cd x; echo [global];摸一下; echo [global]' – twalberg

+0

已驗證...我經常想到SOF在世界各地的人們遇到這些細節,因爲我沒有看到記錄在我的旅行中的任何地方(:^) –

0

這個ksh腳本在Cygwin中使用ksh版本很好:MIRBSD KSH R48 2013/08/16

的ksh腳本

#!/bin/ksh 
for i in [global] 
do 
    echo ${i} 
done 
exit 0 

KSH腳本輸出:

[email protected]:/tmp $ ksh so7.ksh 
ksh so7.ksh 
[global] 
[email protected]:/tmp $ echo $KSH_VERSION 
echo $KSH_VERSION 
@(#)MIRBSD KSH R48 2013/08/16 
[email protected]:/tmp $ sh so7.ksh 
sh so7.ksh 
[global] 
+0

@ avaPlease42問題我有文件a和b在該目錄。觸摸一個b,然後運行它將列出a&b的腳本 – sfgroups