エスケープスペースを含むディレクトリを変数に渡すには?

エスケープスペースを含むディレクトリを変数に渡すには?

以下の小さなtest.shスクリプトがあります。

#!/bin/bash
read -e -p "Enter a Directory: " directory
echo $directory

私が実行すると、これが起こります。

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A Directory/

プログラムの出力が次のように、その変数内にエスケープスペースを保持できるようにしたいと思います。

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A\ Directory/

これを行う方法を知っている人はいますか?その目的は、読み取る必要があるファイルがどこにあるのかをスクリプトに伝えることです。

編集:2番目と3番目のコード選択に\を入れることを忘れました。

ベストアンサー1

変数に保存するエスケープスペースがありません。プロンプトに入力すると、~/A Directory/変数にがdirectory含まれます~/A Directory/。後でスクリプトでこの空白に問題が発生した場合、その理由は次のとおりです。変数拡張の周りに二重引用符を忘れました。

read -e -p "Enter a Directory: " directory
ls -- "$directory"
cd -- "$directory"

--値がで始まる場合、-オプションとは見なされません。

何らかの理由でスペースの前にバックスラッシュを追加する場合は、次のように使用できます。bash 文字列操作関数

echo "${directory// /\\ }"

しかし、これは役に立たないようです。ディレクトリを再解析された形式で印刷する必要がある場合は、引用する必要がある他の文字がはっきりしているはずです。一部の文字は解析対象によって異なりますが、少なくともタブ(および改行、スクリプトは読み取れません)を引用符で囲む必要があり(空白の場合)、バックスラッシュも引用符で囲む必要があります。 Bashではこれを行う便利な方法はありません。 sedを使用できますが、データを渡すときは注意してください。  echo変更されていないすべての引数は印刷されません。難易度が高くなるコマンド置換は末尾の改行文字を削除しますが、ここには改行文字はありません。

quoted_directory=$(printf %s "$directory" | sed 's/[\\ '$'\t'']/\\&/')

また、最初はチルダを拡張できる項目はありません。 (あなたが示す出力は偽です。あなたはいたずらです!)チルダ拡張は、変数の値が拡張されたときではなく、ソースコードの解析中にのみ発生します。初期チルダをホームディレクトリに置き換えるには、手動で実行する必要があります。

read -e -p "Enter a Directory: " directory
if [[ $directory = \~/* ]]; then
  directory="$HOME/${directory#*/}"
fi
ls -- "$directory"
cd -- "$directory"

おすすめ記事