簡體   English   中英

如何從命令行中的腳本運行 function?

[英]How can I run a function from a script in command line?

我有一個具有某些功能的腳本。

我可以直接從命令行運行 function 之一嗎?

是這樣的嗎?

myScript.sh func()

好吧,雖然其他答案是正確的-您當然可以做其他事情:如果您可以訪問 bash 腳本,則可以對其進行修改,只需在末尾放置特殊參數"$@" -它將擴展為參數在您指定的命令行中,並且由於它是“單獨的”,shell 將嘗試逐字調用它們; 在這里你可以指定函數名作為第一個參數。 例子:

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"$@"


$ bash test.sh
$ bash test.sh testA
TEST A 
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2

對於波蘭語,您可以先驗證該命令是否存在並且是一個函數:

# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
  # call arguments verbatim
  "$@"
else
  # Show a helpful error
  echo "'$1' is not a known function name" >&2
  exit 1
fi

如果腳本只定義函數而不執行其他任何操作,您可以先在當前 shell 的上下文中使用source. 命令,然后簡單地調用該函數。 有關更多信息,請參閱help source

以下命令首先在上下文中注冊該函數,然后調用它:

. ./myScript.sh && function_name

簡而言之,沒有。

您可以將腳本中的所有函數與source (詳細信息為help source )一起導入到您的環境中,然后您就可以調用它們了。 這也有執行腳本的作用,所以要小心。

無法從 shell 腳本調用函數,就像它是共享庫一樣。

使用case

#!/bin/bash

fun1 () {
    echo "run function1"
    [[ "$@" ]] && echo "options: $@"
}

fun2 () {
    echo "run function2"
    [[ "$@" ]] && echo "options: $@"
}

case $1 in
    fun1) "$@"; exit;;
    fun2) "$@"; exit;;
esac

fun1
fun2

此腳本將運行函數 fun1 和 fun2,但如果您使用選項 fun1 或 fun2 啟動它,它將僅運行帶有 args(如果提供)的給定函數並退出。 用法

$ ./test 
run function1
run function2

$ ./test fun2 a b c
run function2
options: a b c

我有一種情況,我需要一個來自 bash 腳本的函數,該函數之前不能執行(例如通過source ), @$的問題是 myScript.sh 然后運行兩次,似乎......所以我想出了想用 sed 來實現這個功能:

sed -n "/^func ()/,/^}/p" myScript.sh

為了在我需要的時候執行它,我把它放在一個文件中並使用source

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

編輯:警告 - 似乎這並不適用於所有情況,但適用於許多公共腳本。

如果您有一個名為“control”的 bash 腳本,並且在其中有一個名為“build”的函數:

function build() { 
  ... 
}

然后你可以這樣調用它(從它所在的目錄):

./control build

如果它在另一個文件夾中,那就是:

another_folder/control build

如果您的文件名為“control.sh”,則相應地使函數可調用,如下所示:

./control.sh build

已解決帖子,但我想提一下我的首選解決方案。 即,定義一個通用的單行腳本eval_func.sh

#!/bin/bash
source $1 && shift && "@a"

然后通過以下方式調用任何腳本中的任何函數:

./eval_func.sh <any script> <any function> <any args>...

我在接受的解決方案中遇到的一個問題是,當在另一個腳本中獲取我的包含函數的腳本時,后者的參數將由前者評估,從而導致錯誤。

這里的其他答案很好,非常感謝,但通常我不想在 session 中獲取source (它在當前 shell 中讀取並執行文件)直接修改它。

我發現編寫一兩行“引導程序”文件並運行它更方便。 使測試主腳本更容易,對您的 shell session 沒有副作用,作為獎勵,您可以加載模擬其他環境的東西進行測試。 例子...

# breakfast.sh
make_donuts() { 
     echo 'donuts!'
}

make_bagels() {
     echo 'bagels!'
}
# bootstrap.sh
source 'breakfast.sh'

make_donuts

現在只需運行 ./bootstrap.sh 。同樣的想法適用於您的./bootstrap.sh或任何腳本。

為什么有用? 假設您出於某種原因使您的生活變得復雜,並且您的腳本可能會發現自己處於不同的環境中並呈現不同的狀態。 例如,您的終端 session,或者雲提供商的酷炫新事物。 您還想使用簡單的方法在終端中測試雲事物。 不用擔心,您的引導程序可以為您加載基本的 state。

# breakfast.sh
# Now it has to do slightly different things
# depending on where the script lives!

make_donuts() {
    if [[ $AWS_ENV_VAR ]]
    then
        echo '/donuts'
    elif [[ $AZURE_ENV_VAR ]]
    then
        echo '\donuts'
    else 
        echo '/keto_diet'
    fi
}

如果你讓你的引導程序發生爭論,你可以為你的 function 加載不同的 state 來咀嚼,仍然在 shell session 中有一行:

# bootstrap.sh
source 'breakfast.sh'

case $1 in
    AWS)
        AWS_ENV_VAR="arn::mumbo:jumbo:12345"
    ;;
    AZURE)
        AZURE_ENV_VAR="cloud::woo:_impress"
    ;;
esac

make_donuts # You could use $2 here to name the function you wanna, but careful if evaluating directly.

在終端 session 中,您剛剛輸入: ./bootstrap.sh AWS結果: # /donuts

您可以從命令行參數調用函數,如下所示

function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1

一旦你函數結束把 $1 接受參數讓說上面的代碼保存在 fun.sh 中運行函數 ./fun.sh irfan & ./fun.sh config

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM