我正在使用bash -c
命令和函數:
fun ()
{
echo "$0" ## it reads the parameter $i
}
for i in {1..5}
do
bash -c "fun" $i &
done
我的問題是我們可以使用 傳遞多個參數給函數bash -c
嗎?例如:
fun ()
{
echo "$0" ## it reads the parameter $i
}
var="string" #variable
for i in {1..5}
do
bash -c "fun" $i $var &
done
答案1
你真的有運行過程式碼嗎?兩個片段都會返回fun: command not found
,這是您需要先解決的問題。
除非您設法導出fun
為函數或定義它別處以一種允許內部bash
識別命令的方式(我不會詳細說明)。這種情況將具有很大的誤導性,因此在進一步問題的背景下是不幸的。
讓我們從執行您可能想要的操作的簡單程式碼開始:
#!/bin/bash
fun ()
{
echo "$1"
}
for i in {1..5}
do
fun "$i" &
done
如果您得到的數字不按順序排列,那是因為&
.我&
在這裡使用是因為它在你的原始程式碼中。
您對函數的定義在語法上是正確的。我的定義使用$1
而不是$0
,我們會得到它。要使用函數,您只需呼叫它的名稱,帶或不帶參數即可。在我們的例子中:
fun
fun arg1
fun arg1 arg2
在函數內部$1
,$2
, ... 擴展為各自的參數。您使用$@
(或$*
如果您知道自己在做什麼)來獲取所有參數。您用來$#
取得參數的數量。這與fun
shell 腳本的情況非常相似。
$0
函數內部是$0
主 shell 的。它與傳遞給函數的參數無關。
您可以在子 shell 中執行該函數:
( fun arg1 )
或在後台(也在子 shell 中隱式運行它):
fun arg1 &
如果fun
是主 shell 中的一個函數,那麼這些子 shell 也會知道當指令是 時要做什麼fun
。另一方面,以 開頭的 shellbash -c
不知道fun
.
再說一次:除非你設法export
…或…
在你的情況下bash -c
這是一個障礙。我認為使用它沒有任何意義。讓它工作是可能的,但會很麻煩。儘管如此,你的明確的問題是:
我們可以使用 向函數傳遞多個參數
bash -c
嗎?
我們可以。下面舉個麻煩的例子。請注意,該功能略有不同(出於教育原因)。我也放棄了,&
因為它只會混淆結果。
#!/bin/bash
fun ()
{
echo "$2"
}
export -f fun
var="string"
for i in {1..5}
do
bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done
將函數從 Bash 匯出到 Bash 是可能的,我們剛剛做到了。將函數從 Bash 導出到另一個 shell 是不可能的,除非 shell 試圖相容並故意將某些環境變數解釋為函數。
fun "$2" "$1"
是單引號的,因此在主 shell 中"$2"
和"$1"
不會擴展(被單引號括起來,他們是不是雙引號)。在內部的上下文中,bash
這些$2
和$1
被雙引號括起來,並且它們擴展為後面提供的參數inner-bash
(這裡是任意名稱)。
看看儲存為的數字會發生什麼$i
:
- 它位於
$i
主 shell 的上下文中; - 然後是
$1
在內殼的上下文中; - 然後它
$2
在內殼函數的上下文中。
在這裡使用沒有任何好處bash -c
,只有不方便。不要以這種方式使你的程式碼複雜化。
還有一件事:雙引號變數。