2017-01-03 26 views
0

私は答えが見つからないという面白い問題があります。私は、デンジャー部門がNginXと設定ファイルを持つドッカーのコンテナを自動的に起動するのに役立つ簡単なアプリケーションを作成しています。私の問題は、何らかの理由で、ディレクトリをスキャンしている間、bashスクリプトがフォルダの名前を格納することができないということです。ここで私は、その後folder_test.shように、その簡単なスクリプトを保存し、1つのフォルダのみ、変更の所有者が私にはありますフォルダに入れて引数に指定された変数に関数出力を保存する

#!/bin/bash 

getFolder() { 
    local __myResultFolder=$1 
    local folder 
    for d in */ ; do 
     $folder=$d 
    done 
    __myResultFolder=$folder 
    return $folder 
} 

getFolder FOLDER 

echo "Using folder: $FOLDER" 

....私が何を言っているかの非常に単純な例であります正しいアクセス許可を与えます。私は、スクリプトを実行したときしかし、私は引用符の異なる種類に$folder=$d一部を入れて試してみました

./folder_test.sh: 8 ./folder_test.sh: =test_folder/: not found 

...エラーを取得しておくが、何も働きません。私は試してみた$folder="'"$d"'"$folder=`$d`$folder="$d"しかし、それは動作しません。私を狂って運転すると、どんな助けも大歓迎です。ありがとうございました。

+4

http://shellcheck.net/すると、自動的にあなたのためにこれをキャッチします。 –

+0

ところで、 'local d 'にもマークをつけていなければ、それをあなたの関数の外側スコープに漏らしています。 –

+0

Hrm。あなたの目標は間接的な割り当てを行うことです。申し訳ありません - 私はそれを閉じてはいけません。 –

答えて

1

犯人はラインと文字通りの下で実行される実行可能ファイルとして名前=test_folder/を扱い、その名前のIEでそれを拡張しようとしたが、前に=記号で保存するフォルダ名を処理している

$folder=$d 

ですその名前のファイルは見つかりません。また、bash機能戻り値が整数のみのタイプに制限されている

folder=$d 

に変更して、あなたは、呼び出し元の関数に文字列を送信することはできません。あなたが空で$folderに呼び出し元の関数にゼロ以外の戻りコードを送信したい場合、あなたは関数から文字列値を返すようにしたい場合は、returnを使用していない

if [ -z "$folder" ]; then return 1; else return 0; fi 

(または)行を追加することができますあなたはという名前の変数にあなたの結果を保存したい場合は、名前だけのechoを行うと、関数名を指定してコマンド置換を使用し、すなわち

getFolder() { 
    local __myResultFolder=$1 
    local folder 
    for d in */ ; do 
     folder=$d 
    done 
    __myResultFolder=$folder 
    echo "$folder" 
} 

folderName=$(getFolder FOLDER) 
echo "$folderName" 
+0

「間接割り当てを行わない」アプローチには、特に移植性とシンプルさに関していくつかのメリットがありますが、パフォーマンス、スコープ、変数の永続性に関する制限があります。暫定ルックアップ - サブシェルにキャッシュされたものは、関数の終了時に失われます)、実行不能にします。 –

2

、何をやっていることは「間接的な割り当て」と呼ばれています。それはBashFAQ #6で覆われています。

#!/bin/bash 
#  ^^^^ not /bin/sh; bash is needed for printf -v 

getFolder() { 
    local __myResultFolder=$1 
    local folder d 
    for d in */ ; do 
    folder=$d 
    done 
    printf -v "$__myResultFolder" %s "$folder" 
} 

getFolder folderName 
echo "$folderName" 

他のアプローチとしては:

  • read使用:

    IFS= read -r -d '' "$__myResultFolder" < <(printf '%s\0' "$folder") 
    
  • evalを使用して(

    一つの方法は、以下であります非常に、非常に慎重に):

    # note \$folder -- we're only trusting the destination variable name 
    # ...not trusting the content. 
    eval "$__myResultFolder=\$folder" 
    
  • namevar S(唯一のbashの新しいバージョンを使用している場合)の使用:

    getFolder() { 
        local -n __myResultFolder=$1 
        # ...your other logic here... 
        __myResultFolder=$folder 
    } 
    
関連する問題