簡體   English   中英

在bash中的變量中傳遞帶有空格的參數

[英]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.

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