Justin đã làm rõ câu hỏi của mình trong bình luận đầu tiên về câu trả lời của quanta. Anh ta đang đọc trong một dòng văn bản bằng cách sử dụng read
(hoặc bằng một số phương tiện động khác) và muốn mở rộng dấu ngã.
Câu hỏi trở thành "Làm thế nào để bạn thực hiện mở rộng dấu ngã trên nội dung của một biến?"
Cách tiếp cận chung là sử dụng eval
, nhưng nó đi kèm với một số cảnh báo quan trọng, cụ thể là khoảng trắng và chuyển hướng đầu ra ( >
) trong biến. Những điều sau đây có vẻ hiệu quả với tôi:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
Hãy thử nó với từng đầu vào sau:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
Giải trình
- Các ký tự
${mypath//>}
loại bỏ các >
ký tự có thể ghi đè lên một tệp trong eval
.
- Việc
eval echo ...
mở rộng dấu ngã thực sự là gì
- Các trích dẫn kép xung quanh
eval
là để hỗ trợ tên tệp có khoảng trắng.
Để bổ sung cho điều này, bạn có thể cải thiện UX bằng cách thêm -e
tùy chọn để đọc:
read -p "Provide the destination directory: " -e DESTINATION
Bây giờ khi người dùng gõ vào dấu ngã và tab, nó sẽ mở rộng. Tuy nhiên, cách tiếp cận này không thay thế cách tiếp cận eval ở trên, vì việc mở rộng chỉ xảy ra nếu người dùng nhấn tab. Nếu anh ta chỉ gõ ~ / foo và nhấn enter, nó sẽ vẫn là dấu ngã.
Xem thêm:
cd "~/Desktop"
bạn cũng gặp lỗi. Nó phải được bỏ trích dẫn hoặc được lưu trữ dưới dạng một biến (không có dấu ngoặc kép). Ví dụ:a=~/Desktop; cd $a;
hoạt động nhưng khônga="~/Desktop"; cd Desktop;
Xem serverfault.com/questions/417252/ từ