2017-06-26 4 views
0

状況は次のとおりです:インタラクティブTUIといくつかの関数を持つグローバルスクリプトと、グローバルスクリプトから1つの関数しか使用しない中間スクリプト。 例: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ループから呼び出すことができます。

scriptname 3 

function3を実行するために:あなたは、次に使用する

#!/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 

+0

ありがとう、@バーマ、それを試みます。そして、外部スクリプトからこのfunction3を呼び出す方法は、冒頭の「読み込み」を含むすべてのプロンプトを黙ってバイパスすることですか? – faceless

+0

それを答えに加えました。 – Barmar

+0

ありがとう、@Barmar。これだよ! – faceless

関連する問題