wildcards и оператор выбора if

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

wildcards и оператор выбора if

#1

27 авг 2017, 01:50

Изучаю bash. Решил потренироваться. Пишу:

Код: Выделить всё

#!/bin/bash
if [ "$(file $1)" = "${1}: directory" ]
then
    zenity --info --text="Вы указали директорию, поэтому будет создана мягкая ссылка."
    path_to_save=$(zenity --file-selection --filename=$(basename $1) --save)
    ln -s $1 $path_to_save
else
    link_type=$(zenity --list --text="Выберите тип ссылки" \
        --radiolist --column="Выбор" --column="Тип ссылки" \
        TRUE "Мягкая" \
        FALSE "Жесткая")
    path_to_save=$(zenity --file-selection --filename=$(basename $1) --save)

    if [ "$link_type" = "Мягкая" ]
    then
        ln -s $1 $path_to_save
    
    else
        if [[ "$(ln $1 $path_to_save)" = "ln*" ]]
        then
            zenity --error --text="$(ln $1 $path_to_save)"
        fi
    fi
fi
Возникает ошибка: при вызове ./my_ln.sh ~/.face и сохранении на другой раздел: не выводится сообщение об ошибке zenity --error --text="$(ln $1 $path_to_save)". Делаю вывод, что выражение if [[ "$(ln $1 $path_to_save)" = "[b]ln*[/b]" ]] написано некорректно. Вопрос: как в условии правильно оперировать wildcards (шаблонами замены), в частности - "*"?
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

wildcards и оператор выбора if

#2

27 авг 2017, 08:43

root писал(а): Делаю вывод, что выражение написано некорректно.
Ага, для отлова совпадений оперировать regexp'ами например
В твоей строке проверка обламывается логично

Код: Выделить всё

chocobo@linuxmint ~ $ var="ln*"
chocobo@linuxmint ~ $ echo "$var"
ln*
root писал(а): не выводится сообщение об ошибке
А вот здесь второй момент, на случай отлова эксепшнов - лучше брать сразу из stderr. На примере того, что d stderr есть вообще любая ошибка, без проверки её текста

Код: Выделить всё

ERROR=$(exec ln $1 $path_to_save 2>&1 >/dev/null)
[[ -z $ERROR ]] && ERROR='No error.'
echo "$ERROR"
Ну и проверка самого вхождения тоже слишком размытая - после вызова ln в ошибках или придупреждениях разумеется будет ln: блабла)
Изображение
   
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

wildcards и оператор выбора if

#3

28 авг 2017, 10:56

В продолжение - игры с симлинками (немного отступая от темы заданного вопроса, но логичней в плане реализации приведенного алгоритма)
ооталкиваться можно от результата file для

Код: Выделить всё

chocobo@linuxmint  $ mkdir /tmp/test; cd/tmp/test
chocobo@linuxmint /tmp/test $ mkdir folder1
chocobo@linuxmint /tmp/test $ ln -s folder1 symlink
chocobo@linuxmint /tmp/test $ file *
folder1: directory
symlink: symbolic link to folder1
Или аналогично с проверками

Код: Выделить всё

chocobo@linuxmint $ [ -d folder1 ] && echo "Это директория"
Это директория
chocobo@linuxmint $ [ -L symlink ] && echo "Это симлинк"
Это симлинк
chocobo@linuxmint $ touch testfile
chocobo@linuxmint $ [ -f testfile ] && echo "Это файл"
Это файл
И чуть тоньше, учитывая симлинк это тоже файл или директория:

Код: Выделить всё

chocobo@linuxmint $ [ -d symlink ] && [ -L symlink ] && echo "Это симлинк на директорию"
Это симлинк на директорию
chocobo@linuxmint $ [ -d folder1 ] && [ ! -L folder1 ] && echo "Это директория, но не симлинк"
Это директория, но не симлинк

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

wildcards и оператор выбора if

#4

28 авг 2017, 17:08

Chocobo, так я и отталкиваюсь от file if [ "$(file $1)" = "${1}: directory" ].
Дословно: если результат работы file с 1-м аргументом соответствует записи "полный путь до файла: directory", то zenity --info --text="Вы указали директорию, поэтому будет создана мягкая ссылка.".

По поводу всего остального, спасибо, конечно, но "это мы не проходили, это нам не задавали") :-D
Это пока только ждёт своего часа для изучения)

Код: Выделить всё

-a file
            истинно если файл существует.
-d file
            истинно если файл существует и является директорией.
-f file
            истинно если файл существует и является обычным файлом.
-r file
            истинно если файл существует и доступен для чтения.
-s file
            истинно если файл существует и его размер больше 0.
-w file
            истинно если файл существует и доступен для записи.
-x file
            истинно если файл существует и является исполняемым.
file1 -nt file2
            истинно если файл file1 новее чем file2 или file1 (в соответствии со временем последнего изменения) существует, а file2 нет.
file1 -ot file2
            истинно если файл file1 старше чем file2 или file2 существует, а file1 нет.
file1 -ef file2
            истинно если оба файла ссылаются на одно и то же устройство или инод.
Вы не готовы! :pc2:
Изображение

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей