Проверка соответствия строки требованиям пути в FS Linux и Windows
Пишу скрипт на bash, нужно проверять переменную на соответствия требованиям пути в фс как в линуксе, так и в винде.
Нужно в обеих, потому что, например, в линуксе можно создавать файлы с двоеточием в названии или с одними пробелами, а винда такие файлы читать не может.
Да чего уж там, в линуксе можно создать файл с символами переноса строки, или вообще с пустым названием. Такие файлы не то что access, их удалить можно только удалением папки, в которой они находятся, не говоря уже о том, что можно вытварять с запросами на такие файлы.
Я так понял, linux - ОС неограниченных возможностей, но ведь есть же какие-то требования адекватности названий файлов и папок для вменяемой работы с этими файлами и папками?
Нужно предотвратить указание неадекватного пути, которое может быть неправильно понято линуксом и виндой, и при существовании которого линукс и винда могут неадекватно работь с таким файлом/папкой.
Ну я так понял можно использовать alphanumeral chars, нижнее подчеркивание, дефис, скобочки, тильду (в некоторых темперальниках и в винде и в линуксе видел), пробелы (но не одни пробелы), точки (но не одни точки).
1. Есть еще что-то, что я не учел? Может какие-то символы еще нужны?
2. Как это реализовать программно?
В программе нужно, чтобы путь начинался со слеша, нельзя чтобы заканчивался слешом, и путь не должен содержать кавычки.
Вот шаблон:
function read_path() {
path=""
path_correct=false
path_cancel=false
while [[ $path_correct = false ]] && [[ $path_cancel = false]]; do
echo "Enter path:"
read path
if [[ "$path" == "cancel" ]]; then
path_cancel=true
elif [[ "$path" == [^/]* ]]; then
echo "you should specify full absolute path that starts with slash \"/\""
elif [[ "$path" == */ ]]; then
echo "please dont use slash \"/\" at the end of path"
elif [[ вот тут проверка ]]; then
echo "perfect, the path is ok, please proceed"
path_correct=true
else
echo "the path has some unallowed symbols"
fi
done
}
Для проверки я пробовал такие проверки:
[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]