我的 bash 腳本中有以下內容
EXTENSIONS=(php css js)
然后我有這個
declare FILE_TYPES
for EXTENSION in ${EXTENSIONS[@]}; do
FILE_TYPES =("'*.${EXTENSION}'")
done
如果我echo ${FILE_TYPES[@]},我得到這個
'*.php' '*.css' '*.js'
我想創建一個LIST變數,該變數將創建一個由 Git 修改的具有特定擴展名的檔案串列。它應該如下所示:
git diff --name-only --cached --diff-filter=ACMR -- '*.php' '*.css' '*.js'
請注意,如果我運行這樣的命令,它將不起作用:
git diff --name-only --cached --diff-filter=ACMR -- *.php *.css *.js
在我的 bash 腳本中,我正在嘗試這個選項
LIST=$( git diff --name-only --cached --diff-filter=ACMR -- ${FILE_TYPES[@]})
但它不起作用。我有一種感覺,它創建了命令的第二個版本。
任何幫助,將不勝感激!
uj5u.com熱心網友回復:
您不需要陣列值中的單引號;這些將是文字引號,而不是句法引號。只需確保*值中出現文字就足夠了;那么你要參考擴展陣列以防止結果上的檔案名擴展。
EXTENSIONS=(php css js)
declare -a FILE_TYPES
for ext in "${EXTENSIONS[@]}"; do
FILE_TYPES =( "*.$ext" )
done
LIST=$( git diff --name-only --cached --diff-filter=ACMR -- "${FILE_TYPES[@]}" )
uj5u.com熱心網友回復:
不需要迭代,因為從擴展名創建檔案模式是一次性完成的,"${extensions[@]/#/*.}"它將每個extensions陣列條目的開頭替換為*..
#!/usr/bin/env bash
extensions=(php css js)
# Proper way to populate the list array from the output of git-diff
mapfile -t list < <(
git diff --name-only --cached --diff-filter=ACMR -- "${extensions[@]/#/*.}"
)
對于沒有 bash 的過時版本mapfile:
#!/usr/bin/env bash
extensions=(php css js)
IFS=$'\n' read -r -d '' -a list < <(
git diff --name-only --cached --diff-filter=ACMR -- "${extensions[@]/#/*.}"
)
uj5u.com熱心網友回復:
試試這樣:
declare FILE_TYPES
for EXTENSION in "${EXTENSIONS[@]}"; do
FILE_TYPES =("*.${EXTENSION}")
done
LIST=$( git diff --name-only --cached --diff-filter=ACMR -- "${FILE_TYPES[@]}")
請注意在定義中洗掉了單引號并在擴展FILE_TYPES中添加了雙引號。"${FILE_TYPES[@]}"另外還"${EXTENSIONS[@]}"需要使用雙引號。
uj5u.com熱心網友回復:
不確定你想用 git diff-filter 做什么,但你可以使用將變數包裝在一個陣列中printf
$ EXTENSIONS=(php css js)
$ printf "'*.%s' " $EXTENSIONS
'*.php' '*.css' '*.js'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422222.html
標籤:
