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

Языки программирования, IDE, компиляторы, интерпретаторы
Правила форума
Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа.
Аватара пользователя
root
Сообщения: 544
Зарегистрирован: 16 фев 2017, 17:03
Решено: 3
Откуда: г. Хабаровск
Благодарил (а): 167 раз
Поблагодарили: 112 раз

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)" = "ln*" ]] написано некорректно. Вопрос: как в условии правильно оперировать wildcards (шаблонами замены), в частности - "*"?
User: adminka
OS: Linux Mint 18.2 Sonya Cinnamon :thumbs:
Kernel: 4.11.0-14-generic
Devices ► Показать
Я не волшебник, я только учусь ;)

Аватара пользователя
Chocobo
Сообщения: 4602
Зарегистрирован: 27 авг 2016, 19:57
Решено: 110
Откуда: НН
Благодарил (а): 375 раз
Поблагодарили: 1234 раза

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
Сообщения: 4602
Зарегистрирован: 27 авг 2016, 19:57
Решено: 110
Откуда: НН
Благодарил (а): 375 раз
Поблагодарили: 1234 раза

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

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
Devices ► Показать
Я не волшебник, я только учусь ;)


Вернуться в «Скриптинг и программирование»

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

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