2017-06-26 28 views
0

情況如下:我具有交互式TUI和幾個函數的全局腳本和中間腳本,它們必須只使用全局腳本中的一個函數。 例如:BASH:如何靜默地調用外部腳本將變量傳遞給'case'

#!/bin/bash 
echo " INSTRUCTIONS:" 
read -rsp $'Press any key to continue...   \n' -n1 key 

function1 { 
} 

function2 { 
} 

function3 { 
} 

read -r -p "Let's go? [yes/no]: " input 
    if [[ "$input" != "yes" ]] 
     then 
      echo "Process aborted." && 
      exit 
    fi 

PS3='(hit the number): ' 
OPT=("1" "2" "3") 
select opt in "${OPT[@]}" 
do 
    case $opt in "1") 
     function1 
     break 
     ;; 

     "2") 
     function2 
     break 
     ;; 

     "3") 
     function3 
     break 
     ;; 

     *) 
     echo invalid option, please retry 
     ;; 

    esac 
done 
exit 0 

的問題是如何提供的參數中級腳本它會悄悄地用「功能3」唯一的方式,而不會提示做任何全局腳本呢? (閱讀提示和選擇選項)

+1

讓腳本檢查是否設置了「$ 1」,並使用該腳本代替提示。 – Barmar

+0

@Barmar:你能舉個例子嗎? – faceless

回答

1

將該選項作爲命令行參數,並在設置後跳過提示。爲避免重複case代碼,請將其放入函數中,以便可以從主線代碼和select循環中調用它。

#!/bin/bash 

function1() { 
} 

function2() { 
} 

function3() { 
} 

do_func() { 
    opt=$1 
    case $opt in 
     "1") 
     function1 
     ;; 

     "2") 
     function2 
     ;; 

     "3") 
     function3 
     ;; 

     *) 
     echo invalid option, please retry 
     ;; 

    esac 
} 

if [ -n "$1" ] 
then 
    do_func "$1" 
    exit 0 
fi 

echo " INSTRUCTIONS:" 
read -rsp $'Press any key to continue...   \n' -n1 key 

read -r -p "Let's go? [yes/no]: " input 
    if [[ "$input" != "yes" ]] 
     then 
      echo "Process aborted." && 
      exit 
    fi 

PS3='(hit the number): ' 
OPT=("1" "2" "3") 
select opt in "${OPT[@]}" 
do 
    do_func "$opt" 
done 
exit 0 

你會再使用:

scriptname 3 

運行function3

+0

謝謝你,@Barmar,會嘗試。以及如何從外部腳本調用這個函數3,默默繞過所有的提示,包括在開始時的'讀'? – faceless

+0

添加到答案。 – Barmar

+0

謝謝,@Barmar。就是這個! – faceless