[英]Passing Bash argument into Bash Variable encapsulating AWK Command
我需要能夠運行腳本並傳遞參數(日和月),例如
$root# ./myscript -v 31 12
但是我似乎找不到任何合適的方法來在不使腳本阻塞的情況下將命令行參數傳遞到bash變量X中的awk命令中。 我已經嘗試過使用雙引號來允許變量插值,如Stack Overflow上其他地方所述,使用反斜杠將其他美元符號轉義,但無濟於事。
#!/bin/bash
X=$(./some_script | awk -v VARIABLE="$1" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
Y=$(./other_script | awk -v VARIABLE="$2" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")
這使腳本窒息並返回錯誤
awk: syntax error near line 1
awk: bailing out near line 1
已解決似乎標准的Solaris'AWK'將不接受-v標志,並且該特定錯誤表明了這一點。 使用nawk進行切換,如下所示可以正常運行。 @David_W詳細介紹了有關nawk / awk參數傳遞的信息。 非常感謝@Ed_Morton發現錯誤,並感謝@anubhava和@ hek2mgl的概念驗證。
#!/bin/bash
echo
X=$(./some_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
X=$(./other_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")
有路過的環境變量分為兩種方式awk
取決於版本awk
:
較新版本的awk
(在Solaris系統上有時稱為nawk
):
$ awk -v var1="$var1" -v var2="$var2" prog.awk
較早版本的awk使您可以在最后設置變量:
$ awk prog.awk var1="$var1" var2="$var2"
我不確定100%的最后一個方法是否完全正確。 我已經20多年沒有使用舊版本的awk
了。 甚至Solaris也允許您通過調用nawk
或在/usr/xpg4/bin
使用一個版本來使用較新版本的awk
(建議將其放在/bin
和/usr/bin
之前的$PATH
。) ,則其他操作系統(例如Mac OS X和Linux)的shell腳本更可能以兼容的方式工作。)
從Solaris XPG4(第5節)聯機幫助頁:
如果POSIX.2,POSIX.2a,XPG4,SUS或SUSv2所需的行為與歷史Solaris實用程序行為發生沖突,則該實用程序的原始Solaris版本不會更改;
/usr/xpg4/bin
提供了符合標准的新版本。 對於希望利用POSIX.2,POSIX.2a,XPG4,SUS或SUSv2功能的應用程序,應在/usr/xpg4/bin
之前設置/usr/xpg4/bin
設置PATH
(sh
或ksh
)或path
(csh
)環境變量可以找到由那些規范指定的實用程序的目錄,例如/bin
,/usr/bin
,/usr/ucb
和/usr/ccs/bin
。
您可以使用awk -v name=val
從外殼將參數傳遞給awk
:
嘗試這個:
#!/bin/bash
X=$(./some_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
Y=$(./some_other_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.