似乎有幾個問題與你有什麼以上。
首先,我爲了得到NAWK錯誤您先前已@ John1024同意這一點,你必須實際運行:
BUSINESS_DAYS=`echo $($currCal|nawk "NR>2 {print substr($0,4,14)}" |tr "\n" " ")`
與各地NAWK腳本雙引號。
此外,一旦你解決nawk錯誤,你會遇到問題,你如何使用currCal
。您將cal
命令的實際輸出轉換爲currCal
變量,但之後將變量值(即cal
的輸出)用作|
之前的命令,而不是echo
將其轉換爲管道或類似物。
這引發了一個額外的問題,你爲什麼要在另一個子shell(外部`s)中使用子shell命令($()
部分)的結果使用echo
。
最後,上面顯示的兩行只會將本月的工作日列表變爲BUSINESS_DAYS
變量。他們不輸出/保存這樣的第16天。
考慮上述所有的考慮(也改變一貫使用$()
子shell語法),你可能需要以下調用之一:
如果你真的需要緩存當前月份的日曆,並希望拉多天:
currCal="$(/usr/bin/cal)"
BUSINESS_DAYS="$(echo "${currCal}" | \
nawk 'NR>2 {print substr($0,4,14)}' | \
tr "\n" " ")"
DAY=16
DAYTH_DAY="$(echo "${BUSINESS_DAYS}" | nawk -v "day=${DAY}" '{ print $day }')
如果這只是一和完成:
DAY=16
DAYTH_DAY="$(/usr/bin/cal | \
nawk 'NR>2 {print substr($0,4,14)}' | \
tr "\n" " " | \
nawk -v "day=${DAY}" '{ print $day }')"
還有一點需要注意:如果完全在awk(/ nawk)中完成,這裏的處理可以簡化,但是我想堅持已經選擇的基本框架。每在註釋請求
更新:
純POSIX awk的版本:
DAY=16
DAYTH="$(cal | awk -v "day=${DAY}" '
(NR < 3) { next ; }
/^.[0-9 ]/ { $1="" ; }
/^/|| (NF == 7) { $NF="" ; }
{ hold=hold $0 ; }
END { split(hold,arr," ") ; print arr[day] ; }')"
是,簡化是見仁見智,我敢肯定,有人可以使這個更簡潔。這是如何工作的說明:
跳過CAL輸出頭:
(NR < 3) { next ; }
對於對週日的日期周,修剪那個星期天的日期:
/^.[0-9 ]/ { $1="" ; }
對於在星期日(一個月的第一個星期)後開始的星期或星期有整整七天,修剪當週星期六的日期:
/^/|| (NF == 7) { $NF="" ; }
一旦線路只有工作日的日期,咖喱他們進入hold
:
{ hold=hold $0 ; }
最後,劈在空間hold
所以我們可以抓住第N天:
END { split(hold,arr," ") ; print arr[day] ; }')"
如圖所示,命令在_single_引號中有''NR> 2 {print substr($ 0,4,14)}''。如圖所示,錯誤消息表示運行了_different_命令,其中一個參數nawk在_double_引號中,而不是_single_引號。 – John1024
@ John1024謝謝約翰。我試過這個BUSINESS_DAYS ='$($ currCal | nawk「NR> 2 {print substr($ 0,4,14)}」| tr「\ n」「」)'但是同樣的錯誤。 – Pat
同樣,當你需要使用單引號時,你在awk參數周圍使用了雙引號。 – John1024