сравнить подстроку переменной с другой строкой в ​​unix

Я новичок в Unix. Приношу свои извинения, если вопрос звучит слишком неубедительно.

Я передам аргумент переменной fullstring=$1. Вход для этой переменной может быть чем-то похожим на эти параметры, например, tester.txt или tester.sh, или testapiece.zip, или testing.bad, или *.* В основном это что-то вроде строки, содержащей шаблон подстановочного знака имени файла вместе с типом файла.

Здесь мне нужно вырезать только тип файла из строки, переданной в аргументе, т.е. в основном мне нужно вырезать строку из "." до конца, и мне нужно сравнить его с несколькими строками в предложении IF.

Схема структуры кода будет похожа на структуру ниже:

IF substring of variable(just the filetype in the variable)  is not equals to any of the set of 4 predefined file type strings (txt,zip,csv,*)
THEN 
     ECHO "file is not in the required file type"
     EXIT
ELSE
     ECHO "file is in required file type"
FI

Было бы полезно, если бы кто-нибудь мог помочь мне с условием сравнения в предложении IF. Заранее спасибо.

Примечание: мы можем передать буквальный * в качестве типа файла, его следует буквально сравнивать с *


person pran    schedule 24.05.2017    source источник
comment
Вероятно, вам нужно базовое имя вместо регулярного выражения. И вам определенно следует написать программу, чтобы попытаться решить проблему, а затем спросить, когда вы столкнетесь с проблемами - stackoverflow не является платформой для запроса написания алгоритма.   -  person L. Scott Johnson    schedule 24.05.2017
comment
Вы хотите написать это на Bash? Какая-то другая оболочка? В тегах отсутствует язык.   -  person Benjamin W.    schedule 24.05.2017
comment
Я хочу написать этот код на KSH   -  person pran    schedule 24.05.2017
comment
Привет, Скотт Джонсон, Мои извинения. На самом деле это более крупный код, который я написал. Это условие IF является частью полного кода, который я не мог реализовать в нем. Я не уверен, смогу ли я предоставить полный код. Итак, я просто предоставил более подробную информацию о том, что я ищу. Я определенно пытаюсь реализовать это, но не могу это исправить, поэтому обратился за предложениями ваших экспертов по stackoverflow. Спасибо   -  person pran    schedule 24.05.2017
comment
Расширения имен файлов - это просто соглашения ... текстовый файл не обязателен, чтобы иметь .txt расширение, .zip может означать несколько вещей и т. Д. Вы можете / должны сначала проверить фактический тип, и затем проверьте расширение, если необходимо. Вы можете получить mime-тип, используя file --brief --mime <filename> - если он говорит application / zip; charset = binary, вам все равно, что это за расширение, но если в нем написано text / plain; charset = ‹something›, вам может быть интересно, .csv или .txt или вообще без расширения.   -  person Stephen P    schedule 25.05.2017
comment
wrt passing an argument to a variable - вы не передаете аргументы переменным, вы передаете аргументы скриптам, программам, функциям и т. д. Вы присваиваете значения переменным. wrt need to cut just the file type - в имени файла нет типа. Может быть такой суффикс, как .txt, но это не значит, что это текстовый файл, это может быть электронная таблица Excel или что-то еще. Чтобы определить тип файла, вы используете команду file для анализа его содержимого.   -  person Ed Morton    schedule 25.05.2017


Ответы (1)


Работает это так:

str="a.txt"
if [ "${str##*.}" = "txt" ] ; then
    do this
else
    do that
fi

${str##*.} - это так называемое расширение параметра. Дополнительную информацию об этом можно найти здесь: http://www.informit.com/articles/article.aspx?p=99035&seqNum=3

person hek2mgl    schedule 24.05.2017
comment
Спасибо .. изучаю это - person pran; 24.05.2017
comment
Как OP должен тестировать набор из 4 предопределенных типов файлов? 4 оператора if, регулярное выражение, вариант использования или egrep? - person Walter A; 24.05.2017
comment
Спасибо, это сработало для одного типа файла, но как проверить набор из 4 или 5 предопределенных типов файлов, могу ли я использовать '||' для сравнения нескольких наборов - person pran; 24.05.2017
comment
При тестировании одного из нескольких расширений можно использовать оператор case ext=""${str##*.}" ... case ${ext} in ..._ 3_ ... zip) и т. Д. - person Stephen P; 25.05.2017