Bash

Shellcheck 批准將一個變數中的 2 個參數傳遞給 bash 腳本中的命令的方法

  • May 19, 2022

在 bash 腳本中,我呼叫了另一個程序,但我想使用命令行選項配置該程序。以下作品:

AREA_ARG=""
if __SOME_SETTING__ ; then
 AREA_ARG=" --area us,ca "
fi

process_data -i /some/path $AREA_ARG

即 bash 要麼執行process_data -i /some/path,要麼process_data -i /some/path --area us,ca .

然而shellcheck抱怨!

$ shellcheck test.sh 

In test.sh line 7:
process_data -i /some/path $AREA_ARG
                          ^-------^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
process_data -i /some/path "$AREA_ARG"

For more information:
 https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...

我理解原理,但我希望/需要變數在空間上拆分,以便process_data獲得 2 個參數。

這樣做的正確方法是什麼bash

使用數組

這是您使用數組重寫的程式碼。也是一個工作範例(ls代替您的命令),並對變數使用正確的大小寫(編碼標准說大寫名稱是為系統保留的)。

#!/bin/bash

area_args=()
if true ; then
 area_args=(-l -a)
fi

ls "${area_args[@]}"

對於您的特定案例,有一個更簡單的答案:

unset -v area
if __SOME_SETTING__; then
 area="ca,us"
fi

process_data -i /some/path ${area+ --area "$area" }

如果由於某種原因您不能使用數組,並且您需要比上述實踐提供的更多控制,您可以考慮使用函式包裝器。

withOptionalArea() {
 if __SOME_SETTING__; then
   "$@" --area us,ca
 else
   "$@"
 fi
}

withOptionalArea process_data -i /some/path

…但這應該只在特殊情況下才有必要。


真的,使用數組。

引用自:https://unix.stackexchange.com/questions/702993