1. ホーム
  2. bash

[解決済み】Bashで渡された引数がファイルかディレクトリかをチェックする。

2022-04-12 20:01:08

質問

Ubuntuで、ファイル名かディレクトリを渡して、ファイルのときは特定のことを、ディレクトリのときは別のことをできるような、非常にシンプルなスクリプトを書こうとしています。 問題は、ディレクトリ名やファイル名にスペースやエスケープ可能な文字が含まれている場合です。

以下は、私の基本的なコードと、いくつかのテストです。

#!/bin/bash

PASSED=$1

if [ -d "${PASSED}" ] ; then
    echo "$PASSED is a directory";
else
    if [ -f "${PASSED}" ]; then
        echo "${PASSED} is a file";
    else
        echo "${PASSED} is not valid";
        exit 1
    fi
fi

そして、その出力がこちらです。

andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory

andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file

andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid

andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid

これらのパスはすべて有効であり、存在します。

解決方法は?

これでうまくいくはずです。なぜ失敗するのか、よくわかりません。変数の引用符付けは正しく行われています。このスクリプトをダブルクォートで使用するとどうなりますか? [[ ]] ?

if [[ -d $PASSED ]]; then
    echo "$PASSED is a directory"
elif [[ -f $PASSED ]]; then
    echo "$PASSED is a file"
else
    echo "$PASSED is not valid"
    exit 1
fi

二重角括弧は、bashの拡張機能である [ ] . 変数にスペースが含まれていても、引用符で囲む必要はありません。

また、試してみる価値はあります。 -e は、ファイルの種類をテストせずに、パスが存在するかどうかをテストします。