[英]Why does my bash script flag this awk substring command as a syntactic error when it works in the terminal?
我正在嘗試使用lynx的轉儲功能從一系列鏈接中提取日期列表,並通過grep和awk傳遞輸出。 此操作在終端中成功完成,並准確輸出日期。 但是,將bash放入shell腳本時,它會聲明語法錯誤:
Scripts/ETC/PreD.sh: line 18: syntax error near unexpected token `('
Scripts/ETC/PreD.sh: line 18: ` lynx --dump "$link" | grep -m 1 Date | awk '{print substr($0,10)}' >> dates.txt'
對於上下文,這是while讀取循環的一部分,在該循環中,正在從文件讀取$ link。 當刪除awk命令時,在此while循環內進行的操作都將成功,包括其他awk命令的類似while循環也一樣。
我知道我誤解了bash如何處理變量替換,bash如何處理awk命令或兩者的某種組合。 任何幫助將不勝感激。
編輯:Shellcheck對此有所分歧,網站版本沒有發現錯誤,但是我下載的版本提供了錯誤SC1083,其中說:
This { is literal. Check expression (missing ;/\n?) or quote it.
可以在Shellcheck GitHub頁面上查看:
This error is harmless when the curly brackets are supposed to be literal, in e.g. awk {'print $1'}.
However, it's cleaner and less error prone to simply include them inside the quotes: awk '{print $1}'.
腳本如下:
#!/bin/bash
while read -u 4 link
do
IFS=/ read a b c d e <<< "$link"
echo "$e" >> 1.txt
lynx --dump "$link" | grep -A 1 -e With: | tr -d [:cntrl:][:digit:][] | sed 's/\With//g' | awk '{print substr($0,10)}' | sed 's/\(.*\),/\1'\ and'/' | tr -s ' ' >> 2.txt
lynx --dump "$link" | grep -m 1 Date | awk '{print substr($0,10)}' >> dates.txt
done 4< links.txt
在sed
命令中,由於未加引號,所以您沒有匹配'
'
。
在awk
腳本中,您具有恆定的零length
變量。
從gawk手冊 :
substr(字符串,起始[,長度])
返回字符串的長字符長子串,從字符編號start開始。 字符串的第一個字符是字符號一。48例如,substr(“ washington”,5,3)返回“ ing”。
如果不存在length,則substr()返回以字符號start開頭的字符串的整個后綴。 例如,substr(“ washington”,5)返回“ ington”。 如果length大於字符串中剩余的字符數(從字符開始算起),則也返回整個后綴。
如果start小於1,則substr()會將其視為1。 (在這種情況下,POSIX未指定要執行的操作:BWK awk以此方式執行操作,因此gawk也會這樣做。)如果start大於字符串中的字符數,則substr()返回空字符串。 同樣, 如果存在length但小於或等於零,則返回空字符串。
另外,我建議您將grep|awk|sed|tr
合並為單個awk腳本。 並使用打印輸出調試awk腳本。
從:
lynx --dump "$link" | grep -A 1 -e With: | tr -d [:cntrl:][:digit:][] | sed 's/\With//g' | awk '{print substr($0,10,length)}' | sed 's/\(.*\),/\1'\ and'/' | tr -s ' ' >> 2.txt
至:
lynx --dump "$link" | awk '/With/{found=1;next}found{found=0;print sub(/\(.*\),/,"& and",gsub(/ +/," ",substr($0,10)))}' >> 2.txt
從:
lynx --dump "$link" | grep -m 1 Date | awk '{print substr($0,10,length)}' >> dates.txt
至:
lynx --dump "$link" | awk '/Date/{print substr($0,10)}' >> dates.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.