bashでホームキャラクター(〜)を使用してディレクトリが存在するかどうかを確認できない


16

bashディレクトリが失敗した場合、次のチェックを行うのはなぜですか?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktop確かに存在します。ちなみにこれはMac上です。


問題はこのタイプのスクリプトにあります

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
あなたがcd "~/Desktop"するときと同じように、あなたもエラーを受け取ります。引用符で囲まないか、変数として(引用符なしで)保存する必要があります。例えば、a=~/Desktop; cd $a;作品ではなく、a="~/Desktop"; cd Desktop;参照してくださいserverfault.com/questions/417252/...
dylnmc

回答:


7

ジャスティンは、量子の答えに関する最初のコメントで彼の質問を明確にした。彼はread(または他の動的な手段を使用して)テキスト行を読んでおり、チルダを展開したいと考えています。

問題は、「変数の内容に対してチルダ展開をどのように実行しますか?」になります。

一般的なアプローチはを使用するevalことですが、いくつかの重要な注意事項>があります。つまり、変数のスペースと出力リダイレクト()です。次は私のために働くようです:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

次の各入力で試してください。

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

説明

  • ${mypath//>}アウトストリップ>中にファイルを壊し可能性の文字をeval
  • eval echo ...実際のチルダ展開を何です
  • を囲む二重引用符は、evalスペースを含むファイル名をサポートするためのものです。

これを補足するものとして、次の-eオプションを追加して、UXを改善できます。

read -p "Provide the destination directory: " -e DESTINATION

ユーザーがチルダを入力してタブを押すと、展開されます。ただし、ユーザーがタブを押した場合にのみ展開が行われるため、このアプローチは上記のevalアプローチに代わるものではありません。〜/ fooと入力してEnterキーを押すと、チルダのままになります。

こちらもご覧ください:


23

ディレクトリーを囲む二重引用符を削除して、機能するかどうかを確認します。

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

その理由は、チルダ展開が引用符で囲まれていない場合にのみ機能するためです。

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

値が動的に入ってきたらどうでしょう。すなわち(pastie.org/4471350)およびDESTINATIONです~/Desktop
ジャスティン

3
チルダ展開は変数が設定されたときに行われ、評価されたときではありません。したがって、これは公平な例ではありません。
MadHatter

+1、これは私の問題を解決するのに十分です。
フライングフィッシャー


1

走る

echo $HOME

を使用$HOMEし、ユーザーが実際にスクリプトを使用していることを確認します。ルートが~/rootはなくで見るつもりを使うなら/home/$USER

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

〜ではなく$ HOMEにする必要があります

〜はキーボードのことです


ここで他の答えを読むと、これが間違っていることに気付くでしょう。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.