5

パラメータが場所へのパスになるシェルスクリプトを書いています。readlink -fコマンドを使用して、ユーザーが送信したパスの絶対パスを取得しています。ユーザーが送信するパスに次のようなスペースがあるとします。

    /home/stack over flow/location

私はユーザーが次のような引用符で送信することを除いています

    "/home/stack over flow/location"

ここに2つの問題があります。

1)パスが引用符付きで渡されたとしても、$ @を反復処理すると、引用符が抑制され、引用符なしのパスが取得されます。

2)パラメータにスペースが含まれているかどうかを確認するための回避策を実行し、次のように明示的に追加しました

    if [[ $1 = *\ * ]] ; then
           temp=\"$1\"
    fi

引用符を明示的に追加しましたが、現在直面している問題は、スペースを含む変数を追加したにもかかわらず、readlinkが機能しないことです。

    full_path=`readlink -f ${temp}`

その言い回しの使用法:readlink [-n] [-f] symlink

次のようなシェルで通常のUNIXコマンドとして実行すると

       readlink -f "/home/stack over flow/location"

これは機能していて、私はフルパスを取得しています。スペースを追加しても、シェルスクリプトでreadlinkが機能しないのはなぜですか?これを手伝ってください。

4

1 に答える 1

6

スクリプトパラメータに引用符なしでパスを取得することは理にかなっています。引用符は、スクリプト自体ではなく、スクリプトの呼び出しを処理するシェルを対象としています。次のようにコマンドを呼び出すと仮定します。

./test "/home/stack over flow/location"

ここで、「test」は実装するスクリプトです。パスを引用符で囲むと、このコマンドを実行するシェルがパスを1つの引数として扱い、引用符がない場合のように3つの個別の文字列として扱わないようにします。ただし、引用符はパラメーター自体の一部としては扱われません。したがって、パラメーターがスクリプトに渡されると、パスに基づいて変更された文字列を保持するパラメーターではなく、パス全体を保持する単一のパラメーターを取得します。つまり、引用符が埋め込まれた文字列です。

そのパラメータは問題なく使用できます。もう一度引用符で囲みます。

readlink -f "$@"

元の呼び出しと同様に、指定されたパスに含まれるブランクを保護します。

于 2012-07-26T07:49:34.163 に答える