Bash

將讀取命令的輸入視為命令本身

  • August 23, 2018

假設我在腳本中定義了這個函式:

fct1() {
 local msg1=${@}
if [[ "${verb}" = 'tru' ]]; then
 echo "I say $msg1"
 sleep 1
 echo "i repeat"
 sleep 1
 echo "I saaaaaaaaay $msg1"
else
 echo "$msg1"
fi
}

我將如何讓使用者從中呼叫此函式read

我在想類似的東西

read fct1 "aha aha ahaaaaa"

輸出將是:

"I say aha aha ahaaaaa" "I repeat" "I saaaaaaaaay aha aha ahaaaaa"

基本上,我如何使用輸入read而不是將其儲存在變數中,而是將其用作命令?

謝謝。

如果您希望將消息作為標準輸入中的一行讀取(在終端中使用腳本時由使用者輸入),然後作為參數傳遞給函式,您可以執行以下操作:

fct1 "$(line)"

line不再是標準命令,但仍然相當普遍。您可以將其替換為head -n1,但在某些實現中,當輸入不是來自終端設備時,它可以讀取多行(儘管它只輸出一行)。

使用bash’sread您必須將其儲存在變數中。這就是read將輸入儲存在變數中的目的。

IFS= read -r line && fct1 "$line"

使用zsh’s read,您可以使用回顯讀取數據的選項-e,而不是將其儲存在變數中,因此上面可以寫成:line``IFS= read -re

fct1 "$(IFS= read -re)"

(這比使用read變數效率低,因為我們需要分叉一個程序,以便 zsh 可以讀取read的輸出)。

當然,您也可以替換您的:

local msg1=${@}

local msg1; IFS= read -r msg1 || return

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