2017-08-18 11 views
0

コマンドラインを実行するための反復メニューを含むスクリプトを書いています。しかし、反復メニューを作成した後、コマンドを実行するときにエラーが発生します。 エラーは[COMMAND]です。このようなファイルまたはディレクトリはありません。関数をインスタンス化した後にBashスクリプトがシバンパスを失った

#!/bin/bash 
ATESTS=("TEST NAME 1" "TESTE NAME 2") 
PATH=("test1.xml" "text2.xml") 

menu() { 
    for i in ${!ATESTS[@]}; do 
     printf "%3d%s) %s\n" $((i+1)) "${OPT[i]:- }" "${ATESTS[i]}" 
    done 
    [[ "$msg" ]] && echo "$msg"; : 
} 

prompt="Check an ATEST (again to uncheck, ENTER when done): " 

while menu && read -rp "$prompt" num && [[ "$num" ]]; do 
    /usr/bin/clear; 
    [[ "$num" != *[![:digit:]]* ]] && 
    ((num > 0 && num <= ${#ATESTS[@]})) || 
    { msg="Invalid ATEST: $num"; continue; } 
    ((num--)); msg="${ATESTS[num]} was ${OPT[num]:+un}checked" 
    [[ "${OPT[num]}" ]] && OPT[num]="" || OPT[num]="+" 
done 

for i in ${!ATESTS[@]}; do 
    [[ "${OPT[i]}" ]] && { printf "%s " "${ATESTS[i]}"; msg=""; } 
done 

echo "$msg" 

for i in ${!ATESTS[@]}; do 
    if [[ "${OPT[i]}" ]] && [[ $PWD = /repo/$USER/program ]]; then 
     find . -iname ${PATH[i]} -exec cat {} \; 
    fi 
done 

* .xmlファイルを見つけて、すでに存在し、/ usr/binに属しているスクリプトで実行します。しかし、findコマンドは実行されません。この例ではcatコマンドも実行されます([COMMAND]このようなファイルやディレクトリはlinuxです)。

関数の前にbashコマンドを1回実行すると、問題はありますが、機能の後でコマンドが失敗します。

スクリプトへのパスを含めずに、/ repo/$ USER/program内で実行するためのスクリプトへのエイリアスを1つ作成します。

答えて

0

この問題は、シバンや機能とは関係ありません。問題は、変数$PATHを使用していることです。この変数は、実行可能なコマンドを検索するディレクトリをシステムに知らせるので、配列に設定すると、${PATH[0]}で指定された場所( "test1.xml")でコマンドを探し始めます。あなたが必要とするすべての実行ファイルが入っているディレクトリだけではディレクトリでもありません。

解決策:コマンドを検索するディレクトリのリスト以外には、変数名PATHを使用しないでください。実際、これは特別な機能を持つ大文字の大部分の変数の1つであるため、このような奇妙な競合を避けるために、スクリプト内で小文字(または大文字と小文字)変数を使用することをお勧めします。

ところで、スクリプトの残りの部分が意味をなさないかどうかはわかりません。条件付き実行の短絡ブール値(例えば、this && that || do something)を使用すると、ロジックに従うのが本当に難しくなります。条件付き実行にはifブロックを使用することを強くお勧めします(最後にforループで行ったように)。彼らは何が起こっているのかをもっと簡単に伝えることができます。

関連する問題