2012-03-16 140 views
1

請您解釋一下爲什麼下面的shell命令是行不通的:提取CSH字符串

sh-3.1$ echo $MYPATH 
/opt/Application/DATA/CROM/my_application 
sh-3.1$ awk '{print substr($MYPATH,3)}' 

感謝 問候

回答

1

MYPATH不會被shell替代,因爲字符串使用單引號。考慮以下幾點:

csh$ echo '{print substr($USER,3)}' 
{print substr($USER,3)} 
csh$ echo "{print substr($USER,3)}" 
{print substr(dshawley,3)} 

單引號的使用指示外殼字符串參數傳遞給程序原樣。 Double引號告訴shell在將參數傳遞給程序之前對參數執行變量擴展。這是shell和一些編程語言(例如perl)中常見的基本shell特性。

接下來的問題是,awk將需要引用第一個參數到substr或解析將失敗。在這種情況下,您可能會看到「非法變量名稱」警告。這是我迷失在csh的地方,因爲我不知道如何在引用的字符串中正確地轉義雙引號。在bash/SH/KSH,你會做以下幾點:

sh$ awk "{print substr(\"$USER\",3)}" 
input 
^D 
hawley 
sh$ 

萬一你還不知道這一點,awk需要它會做任何事情之前的輸入流。我不得不爲這個小例子輸入「input」和EOF字符。

1

Quoting and escaping

"string" is a weak quote. Enclosed whitespace and wildcards are taken as literals, but variable and command substitutions are still performed. 
'string' is a strong quote. The entire enclosed string is taken as a literal. 

可以使用-v選項將變量傳遞給awk

awk -v mypath=$MYPATH 'BEGIN{print substr(mypath, 3)}' 
+0

順便說一句 - 這實際上是一個比我提出的更好的選擇,因爲它避免了shell完全引用頭痛=) – 2012-03-16 12:29:07