簡體   English   中英

Bash變量的后期綁定,同時保留空格

[英]Late binding of Bash variables while preserving spaces

我正在嘗試對我的包在make命令中的目錄進行后期綁定。 基本上,WITH_OPTIONS命令行包含一個以空格分隔的鏈接選項列表,類似於configure腳本。 問題是在解析了這個腳本的命令行之后,目錄被綁定得很晚,所以我需要評估模板字符串以獲得正確的變量綁定。 最接近我可以用這么多谷歌搜索和閱讀Bash常見問題,特別是第50條是這樣的:

MAKE_INSTALL="make install"
TEMPLATE=('--first=$a' '--second=$b' '--third=$a')

# Parse Parameters
a=/first/path
b=/second/path
TEMPLATE_REPL=$( eval echo ${TEMPLATE[@]} )
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE_REPL\""
$CMD

我期望$ CMD包含的是一個帶有一個命令和兩個參數的字符串:

make install WITH_OPTIONS="--first=/first/path --second=/second/path --third=/first/path"

但是,我無法通過bash將部分保持在引號中,因此它會將其解析為:

make install 'WITH_OPTIONS="--first=/first/path' '--second=/second/path' '--third=/first/path"'

這顯然是完全錯誤的,並且在執行時會導致錯誤的命令行。

我錯過了什么? 如何將引號之間的位保留為一個參數,而不是3?

為什么不簡單地將TEMPLATE設為字符串:

TEMPLATE='--first=$a --second=$b --third=$a'
$ a=/first/path
$ b=/second/path
$ eval echo $TEMPLATE
--first=/first/path --second=/second/path --third=/first/path
MAKE_INSTALL="make install"
TEMPLATE='--first=$a --second=$b --third=$a'

# Parse Parameters
a=/first/path
b=/second/path
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE\""
eval $CMD

正如ennuikiller指出的那樣,Arrays是不必要的,但是因為Johnathan Leffler指出make,我試圖執行的命令是忽略雙引號的東西,正確的方法是在執行$ CMD時調用eval。 這將需要一些工作來適應我的腳本,但我認為這是我設置它時問題的基本解決方案。 雖然我不能給予ennuikiller這個解決方案的全部功勞,但我很高興至少給你一個+1的評分。

(Ed:因為需要第二個eval,所以可以刪除第一個eval。)

這是在bash腳本中使用后期綁定的一般示例,包含變量(變量替換):

#!/usr/bin/env bash

A_tmp="echo -n Late binding: \$B !!!"             ## note the slash before $
B="test string"

A=`eval $A_tmp`

echo $A

這個腳本打印:

Late binding: test string !!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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