Shell-Script
在控制台會話中執行 shell 腳本而不將其保存到文件中
我有一個關於 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