Используя команду If, then...fi, как определить, ввел ли пользователь правильный формат файла?

Проблема действительно в том, что две версии Linux имеют несколько разные версии BTRFS, т.е.не поддерживают те же функции:

[ 119.698406] BTRFS info (device sdc2): disk space caching is enabled
[ 119.698409] BTRFS: couldn't mount because of unsupported optional features (10).

Похоже, что xbian поддерживает эти функции, а OpenSuse 42.2 — нет, что препятствует взаимодействию.

Эти функции FS являются необязательными. :Это означает, что можно создавать разделы BTRFS с обратной совместимостью в более новых системах, которые доступны для чтения из более старых систем (без этих функций ), управляемых параметрами, которые передаются в Программа mkfs.btrfs.

Числовой код функции: 10 -неизвестный флаг :0x10. Мне было трудно понять, что означают эти коды (моя догадка :расширенные ссылки на иноды. )Но так как число так мало, я думаю, что это что-то основное. Я думаю, что вы больше не можете сделать эту файловую систему доступной для чтения непропатченными ядрами. В противном случае, зная эту функцию, мы, возможно, могли бы указать параметр монтирования, чтобы избежать ошибки; как здесь, где указан алгоритм сжатия fs:

mount -t btrfs -o compress=lz4 dev /mnt

Если мы не знаем, что это за функция, вы даже не сможете обновить ядро ​​в OpenSuse, чтобы оно соответствовало xbian. Обычно в такой ситуации вы полагаетесь на ext4 вместо этого из соображений совместимости.

-1
26.09.2019, 07:20
3 ответа

Вы можете попробовать приведенный ниже скрипт:

if [ ".$(echo "$file"| cut -d. -f2)" == ".txt" ]
then
echo "File is in correct format."
else
echo "File is not in correct format. Please recheck your file."
fi

Вы можете использовать приведенную ниже команду, если ваше имя файла содержит несколько.(точек)

if [ ".$(echo "$file"| awk -F. '{print $NF}')" == ".txt" ]
0
28.01.2020, 05:09

Конечно, просто расширение файла не является форматом файла. Это просто текст, который любой может изменить простым:

mv image.png word.txt

При этом в этом случае вы можете просто использовать команду basename:

base=`basename "$file".txt`
if test "$base" != "$file"
then
    echo "Success!"
else
    echo "Wrong extension..."
fi
1
28.01.2020, 05:09

Хорошо, давайте вернемся и посмотрим, что вы пытаетесь сделать. Первое, что нужно понять, это то, что вы не хотите проверять, является ли имя файла «*.txt», вы хотите увидеть, соответствует ли оно шаблону «*.txt». Кроме того, есть несколько различных шаблонов, с которыми вы столкнетесь в сценариях Unix; наиболее распространенными являются подстановочные знаки (или шаблоны "glob" )и регулярные выражения (, а также существует ряд версий синтаксиса регулярных выражений ). Здесь у вас есть шаблон глобуса.

Итак, вам нужен инструмент, который выполняет сопоставление шаблонов. (Ну,вы также можете переписать шаблон с другим синтаксисом или использовать совершенно другой подход к проверке расширения; но давайте пока остановимся на сопоставлении шаблонов глобусов.)

Во-вторых, вы используете это в операторе if. Условное в операторе if(вещь между ifиthen)является командой(или, по крайней мере, командой -, подобной вещи ). Оператор ifзависит от того, будет ли эта команда выполнена успешно или нет. Одной из наиболее часто используемых команд в операторах ifявляется [, которая представляет собой команду, подобную этой:

if [ "$file" = "*.txt" ]; then

[выглядит как какой-то синтаксис оболочки или странная скобка, но это не так, это обычная команда (, в основном эквивалентная команде test). Но это обычная команда, которая требует, чтобы ее последний аргумент был снова " ]" (, не совсем закрывающая скобка, просто обычный аргумент команды ), и анализирует остальные аргументы как логическое выражение. См. man [для его синтаксиса. Кроме того, обратите внимание, что я дважды -цитировал как "$file", так и "*.txt", потому что (в качестве обычных аргументов команды )имя файла будет подвергаться разбиению на слова, и они оба будут подвергаться расширению с помощью подстановочных знаков, что может сеять хаос с синтаксисом выражения.

Но [не выполняет сопоставление с образцом. Он может выполнять строковые и числовые (целочисленные )сравнения, но не сопоставление с образцом. Поэтому нам нужно искать в другом месте.

Если вы используете bash (или zsh или даже ksh, но не dash или другую более простую оболочку ), вы можете использовать [[ ]]. В отличие от [, этот представляет собой синтаксис оболочки вместо обычной команды и, по сути, является очищенной -и обновленной заменой [. И он может выполнять сопоставление с образцом с оператором =, если вы оставите правую часть без кавычек. То есть,это будет выполнять буквальное сравнение строк:

if [[ "$file" = "*.txt" ]]; then

И это будет выполнять исправление шаблона глобуса:

if [[ "$file" = *.txt ]]; then

(Обратите внимание, что на самом деле вам не нужно удваивать -кавычки $fileдля любого из них, но я предпочитаю автоматически удваивать -ссылки на переменные кавычек на том основании, что почти всегда безопасно удваивать -заключать их в кавычки, часто небезопасно оставлять их без кавычек, и легче запомнить исключения, в которых они должны быть не в кавычках, чем те, где они должны быть в кавычках.)

Итак, эта последняя команда является возможным ответом для вас при условии , что вы используете оболочку, которая поддерживает [[ ]](, т.е. если вы используете bash shebang, например #!/bin/bashили #!/usr/bin/env bash, не общий sh ).

Если вы используете простую sh, нам придется немного изменить правила. Самый простой способ выполнить сопоставление шаблонов с подстановочными знаками в общей оболочке POSIX — использовать caseвместо if. И это нормально, потому что сопоставление шаблонов с подстановочными знаками — это то, для чего caseбыл создан :

.
case "$file" in
    *.txt )
        echo "File is in correct format." ;;

    * )
        "File is not in correct format. Please recheck your file." ;;
esac

Обратите внимание, что шаблон *(, который соответствует всему, что не соответствует более раннему шаблону ), действует подобно предложению elseв операторе if. Кроме того, к синтаксису нужно немного привыкнуть: )между каждым шаблоном и командой (s )для выполнения, если он совпадает, и ;;в конце команд каждого шаблона.

Есть и другие варианты, если мы переключимся с «Я хочу сопоставить шаблон глобуса» на «Я хочу увидеть, заканчивается ли имя файла на '.txt'». Есть несколько (POSIX -стандартных )способов сделать это с помощью модификаторов расширения имени файла. Например, ${var%pattern}удалит совпадение patternс конца значения переменной (, если соответствует ). Итак, один из стандартных приемов — попытаться удалить «.txt» в конце имени файла и посмотреть, изменилось ли оно. Если да, то ".txt" совпадал; если нет, то не было.Вот так:

if [ "$file" != "${file%.txt}" ]; then

Обратите внимание, что здесь используется проверка не -равенства (!=), потому что строки будут отличаться только в том случае, если «.txt» был успешно удален с конца.

Вы также можете удалить последний "." в имени файла с${file##*.}(и посмотрите, осталось ли «txt» ), но проблема в том, что он будет думать, что имя файла «txt» совпадает. Упс.

0
28.01.2020, 05:09

Теги

Похожие вопросы