0

フォルダーを作成してデータを入力する特定の python スクリプトを実行するかどうかを知るために、最初にフォルダーが存在するかどうかを確認する必要があるバッチ処理スクリプト bash を作成しています。ディレクトリを変更し、保存された変数からディレクトリを見つけることでうまくいく前に、同様のことをしましたが、何らかの理由でここに何かが欠けています。

以下は、スクリプトがどのように機能するかを大まかに示したものです。

if [ -d "$net_output" ]
then
    echo "directory exists"
else
    echo "directory does not exist"
fi

このスクリプトを実行するときは、通常、前の行で $net_output をエコーし​​て、評価結果を確認します。スクリプトを実行すると、「ディレクトリが存在しません」というコードの else ブロックが表示されますが、以前にエコーされた $net_output ディレクトリ パスをコピーしてシェル ターミナルに貼り付けると、ディレクトリが正常に変更され、ディレクトリが実際に存在します。Dell マシンで Ubuntu 12.04 を使用しています。

誰かが提供できる助けを前もって感謝します。提供できる追加情報を教えてください。

4

1 に答える 1

2

誰かがこのような問題を投稿したときに遭遇した最も一般的なケースは次のとおりです。

1.変数にリテラル引用符が含まれています。Bash は引用符を再帰的に解析しません。コマンド ラインで指定された「外側の」引用符のみを解析します。

$ mkdir "/tmp/dir with spaces"
$ var='"/tmp/dir with spaces"'
$ echo "$var"
"/tmp/dir with spaces"
$ [ -d "/tmp/dir with spaces" ]; echo $?
0
$ [ -d "$var" ]; echo $?  # equivalent to [ -d '"/tmp/dir with spaces"' ]
1

2.変数に相対パスが含まれており、現在のディレクトリが予期したものではありません。の値がecho "$PWD"期待どおりに出力されることを確認します。

3.この変数は、DOS ライン末尾が CRLF (\r\n) のファイルから読み取られました。Unix および UNIX 系システムでは、行末に LF (\n) のみを使用します。その場合、パスの末尾に CR (\r) が含まれます。行末の CR は端末では「見えません」。printf '%q\n' "$var"スクリプトのデバッグ中に確認してください。それらを取り除く方法については、BashFAQ 52を参照してください。

于 2012-07-17T18:43:02.523 に答える