Shell

在控制台會話中執行 shell 腳本而不將其保存到文件中

  • November 7, 2022

我有一個關於 Linux 上的 shell 腳本的問題。我正在嘗試執行這個:

$ sh << EOF
#!/bin/sh

function test {
echo test
echo test2
}

test


EOF

結果是:

test
test2

但是,如果我想使用參數執行腳本而不將其保存到文件中怎麼辦?

$ sh  $1 test1 test2 << EOF
#!/bin/sh

function test {
echo $2
echo $3
}

test

EOF

我怎樣才能做到這一點?

-s如果您使用其選項啟動 shell,則 shell 將從標準輸入讀取要執行的腳本。這將阻止它相信第一個選項是腳本文件的名稱。

所以使用bash -s "$1" test1 test2.

請注意,如果腳本(或從腳本中呼叫的任何實用程序)正在從標準輸入流中讀取,它將使用腳本本身。因此,這不適用於需要標準輸入流的腳本。另請注意,我使用bash而不是sh. 這是使用非標準function關鍵字創建函式所必需的。

假設函式(我將把它重命名為mytest內置test命令的名稱)應該輸出腳本的第二個和第三個命令行參數,當你呼叫它時,這些參數需要傳遞給函式。

您可以通過將所有參數傳遞給函式來做到這一點

mytest "$@"

…或者,您可以只傳遞您需要的兩個(並將函式更改為輸出"$1""$2"而不是,這將是它的兩個第一個參數):

mytest "$2" "$3"

您還需要引用所有擴展,例如,$1在命令行上以及$2$3腳本本身中。請參閱何時需要雙引號?

腳本需要使用引用的 here-document 傳遞給 shell,否則腳本中的擴展將由呼叫 shell 而不是由bash您正在啟動的 shell 執行。您通過引用初始 here-document 分隔符的任何部分來引用 here-document。

考慮到所有這些因素,您可能需要使用以下內容:

bash -s "$1" test1 test2 <<'END_SCRIPT'
function mytest {
       echo "$2"
       echo "$3"
}

mytest "$@"
END_SCRIPT

或者,使用sh

sh -s "$1" test1 test2 <<'END_SCRIPT'
mytest () {
       echo "$2"
       echo "$3"
}

mytest "$@"
END_SCRIPT

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