[英]Passing arguments with spaces contained in variable in bash
考慮將一些參數傳遞給函數,例如:
awk -vv1="Hello there" -vv2=Bye 'BEGIN {print v1,v2}'
請注意,第一個參數包含一個空格。 輸出為:
Hello there Bye
現在,我嘗試將參數存儲在變量中。 首先考慮第一個參數中沒有空格的情況:
arg="-vv1=Hello -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
這很好。 現在在變量中插入空格:
arg="-vv1='Hello there' -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
給出錯誤信息:
awk: there'
awk: ^ invalid char ''' in expression
這是怎么回事
根據到目前為止的評論,我想完善我的問題:考慮arg
是另一個shell腳本輸出的情況。 例如,假設genArg
是顯示字符串的shell腳本:
"-vv1='Hello there' -vv2=Bye"
到終端。 然后收集arg
(在腳本中),例如
arg=$(genArg)
接下來,我想使用給定的參數調用awk
:
awk $arg 'BEGIN {print v1,v2}'
使用數組:
arg=(-vv1="Hello there" -vv2=Bye)
awk "${arg[@]}" 'BEGIN {print v1,v2}'
針對您更新的問題和評論:
$ cat tst.sh
function genArg() {
printf "Hello there\n"
printf "Bye\n"
}
IFS=$'\n' rslts=( $(genArg) )
awk -v v1="${rslts[0]}" -v v2="${rslts[1]}" 'BEGIN{
printf "v1=\"%s\"\n", v1
printf "v2=\"%s\"\n", v2
}'
$
$ ./tst.sh
v1="Hello there"
v2="Bye"
這是恕我直言,更好的選擇:
$ cat tst.sh
function genArg() {
printf "Hello there\n"
printf "Bye\n"
}
awk -v rslts="$(genArg)" 'BEGIN{
split(rslts,v,/\n/)
for (i=1;i in v;i++)
printf "v[%d]=\"%s\"\n", i, v[i]
}'
$
$ ./tst.sh
v[1]="Hello there"
v[2]="Bye"
如果要使用命名變量而不是編號變量:
$ cat ./tst.sh
function genArg() {
printf "greeting=Hello there\n"
printf "farewell=Bye\n"
}
awk -v rslts="$(genArg)" 'BEGIN{
split(rslts,tmp,/\n/)
for (i=1;i in tmp;i++) {
var = val = tmp[i]
sub(/=[^=]+/,"",var)
sub(/[^=]+=/,"",val)
v[var] = val
}
for (var in v)
printf "v[%s]=\"%s\"\n", var, v[var]
greeting = v["greeting"]
farewell = v["farewell"]
print "greeting=\"" greeting "\""
print "farewell=\"" farewell "\""
}'
$
$ ./tst.sh
v[greeting]="Hello there"
v[farewell]="Bye"
greeting="Hello there"
farewell="Bye"
我們按原樣使用鍵字符串索引的數組v []或將其值映射到基於鍵字符串專門命名的變量。 無論哪種方式...
嘗試這個:
arg1="-vv1=Hello there"
arg2="-vv2=Bye"
awk "$arg1" "$arg2" 'BEGIN {print v1,v2}'
這樣做的目的是確保awk正確地看到三個字符串參數:vv1,vv2和實際的awk腳本文本。 您可以使用兩個變量以這種方式進行操作,或者,如果您確實願意,也可以使用Bash數組進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.