簡體   English   中英

當我的bash腳本在終端中運行時,為什么將awk子字符串命令標記為語法錯誤?

[英]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
  1. sed命令中,由於未加引號,所以您沒有匹配' '

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM