2013-05-13 35 views
0

這裏是我的file.sh bash腳本:獲得在bash第一行參數分叉過程後

#!/bin/bash 
$(awk '/[ \t]+'$1'\/'$2'/' /etc/servicies) | awk '{print '$1'}'; 

如果我運行:

file.sh 21 tcp 

它應該打印FTP。但我得到那個錯誤:

./file.sh: line 2: ftp: command not found 

有人可以解釋我爲什麼那個錯誤,以及如何解決它?

謝謝。

回答

1
awk '/[ \t]+'$1'\/'$2'/ { print $1 }' /etc/services 
0

爲什麼使用$(...)構造?它被bash所包含命令的輸出所取代,所以你的管道變得類似於

ftp 21/tcp xxx_master # ftp/XXX 

它會觸發上述錯誤。

解決方案:只要刪除$(),一切都應按預期工作。

+0

這是行不通的。它打印出我21.當執行腳本時我傳遞的第一個參數。我需要從印刷的行中拿出拳頭的論點。 – artaxerxe 2013-05-13 07:46:51

+0

@artaxerxe:如果你不想讓shell解釋'$ 1',不要使用它不加引號:'awk'{print $ 1}'' – choroba 2013-05-13 09:19:28

0
awk '$2==A && $3=B, NF=1' FPAT='[^ /]+' A=$1 B=$2 /etc/services 
+0

我不明白你的命令是什麼意思...我是一個新手awk – artaxerxe 2013-05-13 07:48:20

0

有點費解,但... $(無論)執行它的輸出... 因此,假設

$(awk '/[ \t]+'$1'\/'$2'/' /etc/services) 

的$內的部分()讓你的輸出

ftp blahblahblah 

它將首先嚐試執行它,並且僅在將執行輸出傳遞到第二個awk管道後執行。

只需刪除$()語法,這樣第一個awk的輸出將被髮送到後面的步驟。

順便說一句,請的,而不是做

cat xxxx | dosomething 

嘗試做

dosomething xxxxx