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

Языки программирования, IDE, компиляторы, интерпретаторы, гипервизоры и виртуальные среды
Правила форума
Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа.
Аватара пользователя

Автор темы
root
Сообщения: 647
Зарегистрирован: 16 фев 2017, 17:03
Решено: 3
Откуда: г. Хабаровск
Благодарил (а): 191 раз
Поблагодарили: 152 раза

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

Сообщение root » 26 авг 2017, 22: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 (шаблонами замены), в частности - "*"?
User: adminka
OS: Linux Mint 18.2 Sonya Cinnamon :thumbs:
Kernel: 4.11.0-14-generic
Эмоджи смайлы                  


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

Chocobo
Сообщения: 5544
Зарегистрирован: 27 авг 2016, 19:57
Решено: 129
Откуда: НН
Благодарил (а): 411 раз
Поблагодарили: 1437 раз

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

Сообщение Chocobo » 27 авг 2017, 05: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
Сообщения: 5544
Зарегистрирован: 27 авг 2016, 19:57
Решено: 129
Откуда: НН
Благодарил (а): 411 раз
Поблагодарили: 1437 раз

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

Сообщение Chocobo » 28 авг 2017, 07: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
Сообщения: 647
Зарегистрирован: 16 фев 2017, 17:03
Решено: 3
Откуда: г. Хабаровск
Благодарил (а): 191 раз
Поблагодарили: 152 раза

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

Сообщение root » 28 авг 2017, 14: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
            истинно если оба файла ссылаются на одно и то же устройство или инод.
User: adminka
OS: Linux Mint 18.2 Sonya Cinnamon :thumbs:
Kernel: 4.11.0-14-generic
Эмоджи смайлы                  


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