ジャスティンは、量子の答えに関する最初のコメントで彼の質問を明確にした。彼は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キーを押すと、チルダのままになります。
こちらもご覧ください:
cd "~/Desktop"
するときと同じように、あなたもエラーを受け取ります。引用符で囲まないか、変数として(引用符なしで)保存する必要があります。例えば、a=~/Desktop; cd $a;
作品ではなく、a="~/Desktop"; cd Desktop;
参照してくださいserverfault.com/questions/417252/...