Bash

映射參數數組,然後轉換為字元串

  • June 19, 2018

假設我在腳本中有這些bash函式:

foo(){
 my_args_array=("$@")
 export my_args="${my_args_array[@]}"
 bar $my_args
}

bar(){
 echo "number of args: $#";
}


foo a b 'c d e'

如果我執行上面的腳本,我會得到:

參數數量:5

但我正在尋找的是:

參數數量:3

所以我的問題是 - 有沒有辦法映射返回的值my_args_array[@],所以我可以用單引號將每個元素括起來?或者做任何我需要做的事情來使 env 變數字元串看起來像原來的命令行參數。

使用數組,而不是字元串:

#!/bin/bash
foo(){
 my_args=("$@")
 bar "${my_args[@]}"
}

bar(){
 echo "number of args: $#";
}


foo a b 'c d e'

在 Bash 中,在賦值右側使用"${array[@]}"(or ) 有點像(or ):它將數組元素連接到單個字元串,使用空格作為分隔符。(( ) 使用 的第一個字元(字節?)。)這也適用於,等的參數。"$@"``${array[*]}``"$*"``${array[*]}``"$*"``IFS``export``declare``local

然後你有a b c d ein my_args,並且未引用的擴展分裂。

如果你想要一個數組,請使用一個數組:

foo() {
   bar "$@"
}
bar() {
   echo "number of args: $#";
}
foo a b 'c d e'

或者,如果您想要一個字元串,為了清楚起見,最好明確使用"${array[*]}"

(FWIW,Bash 不支持通過環境導出數組$$ 1 $$ $$ 2 $$)

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