可以使用 bash -c 將多個參數傳遞給 bash 函數嗎?

可以使用 bash -c 將多個參數傳遞給 bash 函數嗎?

我正在使用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, ... 擴展為各自的參數。您使用$@(或$*如果您知道自己在做什麼)來獲取所有參數。您用來$#取得參數的數量。這與funshell 腳本的情況非常相似。

$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,只有不方便。不要以這種方式使你的程式碼複雜化。

還有一件事:雙引號變數

相關內容