請您解釋一下爲什麼下面的shell命令是行不通的:提取CSH字符串
sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'
感謝 問候
請您解釋一下爲什麼下面的shell命令是行不通的:提取CSH字符串
sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'
感謝 問候
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字符。
"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)}'
順便說一句 - 這實際上是一個比我提出的更好的選擇,因爲它避免了shell完全引用頭痛=) – 2012-03-16 12:29:07