не корректно работает if в баше.

Автор zyrHQ, 25 июля 2023, 19:42:23

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

zyrHQ

Привет пишу скрипт. Чтобы можно было указать в теримнале  папку и дальше он распокавала все архивы что лежат, в этой папке. Стала ее тестировать и сталкнулась с багом. что дальше превого if с zip  процесс не идет.

ниже привожу пример кода.

логика была такая find  ищет нужный формат. форматы все что мне нужны лежат в отдельном файле.
всесь поиск завернут в цыкл for. И дальше уже в отдельной фунции я описываю так

скрипт нашел zip И zip ИЛИ cbz да это так.
скрипт нашел cbz И zip ИЛИ cbz да это так.
скрипт нашел rar И zip ИЛИ cbz нет это не так иду дальше.
скрипт нашел rar И rar ИЛИ cbr да это так.

но почему-то, он остановился на первом if. И переходить дальше к rar не хочет.
скажите пожалуйста где я ошибаюсь, и почту скрит работает так, а ни как я ожидаю

ps... уту немнго его изменила потому что изночально были мысли делать так [zZ][iI][pP] но во время
редактирования оставила так как все есть сейчас. по этому внизу код вглядит иначе.

Открыть содержимое (спойлер)
#!/bin/bash   -x

FIND_DIR="$1"

ARRAY_FORMAT=($(cat $HOME/.script/list/format_archive.list))


uncommpress_file(){
# $1 NAME FILE
# $2 FORMAT
if [[ $2 -eq zip -ne cbz ]]; then
if [[ -f "/usr/bin/unzip" ]];then
unzip "$1" -d "$1"_ \
&& rm -v "$1"
elif [[ ! -f "/usr/bin/unzip" ]];then
echo -e "nont install unzip apt -y install unzip"
fi
elif [[ "$2" && "rar" || "cbr" ]]; then
if [[ -f "/usr/bin/unrar" ]];then
mkdir -p "$1"_ \
&& mv "$1" "$1"_ \
&& cd "$1" \
&& unrar x "$1" && рм -рф "$1"
elif [[ ! -f "/usr/bin/unrar" ]];then
echo -e "nont install unrar apt -y install unrar"
fi
elif [[ "$2" && "[tT][aA][rR].[xX][zZ]" || "[tT][aA][rR].[gG][zZ]" || "[tT][aA][rR].[bB][zZ][2]" ]]; then
if [[ -f "/usr/bin/tar" ]];then
mkdir -p "$1"_ \
&& tar -xf "$1" -C "$1"_ && рм -рф "$1"
elif [[ ! -f "/usr/bin/tar" ]];then
echo -e "nont install tar apt -y install tar"
fi
else
echo -e "не известная ошибка"
fi
}


find_archive() {

for FORMAT in ${ARRAY_FORMAT[@]};do
IFS=$'\n'
for FILE in $(find "$FIND_DIR" -type f ! -empty  \( -iname "*.$FORMAT"  \) -print ); do
FILE_NAME="$(basename -z "$FILE")"
cd "$(dirname -z "$FILE")" || { echo "Error"; continue;  }
uncommpress_file "$FILE_NAME" "$FORMAT"
done
done #END FORMAT
}


run() {
find_archive
}

run
[свернуть]

dzhoser

Условие [[ $2 -eq zip -nez ]] неверно. Вы пытаетесь проверить, что формат не равен "zip" или "cbz". Правильный синтаксис будет
[[ $2 != "zip" && $2 != "cbz" ]]
Ubuntu->Linux mint->Astra Linux SE->Debian 12
Для новичков

ek-nfn

#2
Цитата: zyrHQ от 25 июля 2023, 19:42:23дальше он распокавала все архивы что лежат, в этой папке.
зачем их сортировать по расширениям, если распаковывать ВСЕ архивы ?
find вытаскивает ВСЕ архивы и они отправляются для распаковки на какой-нибудь архиватор с нужными параметрами (в отдельные папки и т.д.) Например, в unp
Debian 12  -> Devuan 5 xfce -> MX Linux 23

zyrHQ

#3
Цитата: ek-nfn от 25 июля 2023, 20:28:59
Цитата: zyrHQ от 25 июля 2023, 19:42:23дальше он распокавала все архивы что лежат, в этой папке.
зачем их сортировать по расширениям, если распаковывать ВСЕ архивы ?
find вытаскивает ВСЕ архивы и они отправляются для распаковки на какой-нибудь архиватор с нужными параметрами (в отдельные папки и т.д.) Например, в unp

потому что. Мне нужен скрипт как можно более универсальный. В дальнейшем я его допишу и там будут распаковки iso nrg mdf  форматов. А там своии тонкости, не каждый формат то что он с раширением iso является iso. A есть те что iso. Занаю взучит странно но такие файлы есть и нужно  на каждый файл нужен по сути индивудальный подход. Потом есть мысли его скопировать и уже распаковывать не архивы, а книги и документы. Чтобы получить картинки и голый текст. И вот еще есть формат .exe не все форматы exe являются exe иногда это zip. Вообщем не заню пока за чем это мне, но все делать пока нечего вот занимаюсь ерундой. Которая может быть когда нибудь будет полезной. Вот с распаковкой сейчас полезная штука. Ибо есть 50 файлов разных форматов. 

25 июля 2023, 21:40:10
Цитата: dzhoser от 25 июля 2023, 20:01:15Условие [[ $2 -eq zip -nez ]] неверно. Вы пытаетесь проверить, что формат не равен "zip" или "cbz". Правильный синтаксис будет
[[ $2 != "zip" && $2 != "cbz" ]]

спасибо попробую  потом отпишусь

25 июля 2023, 21:52:27
Цитата: dzhoser от 25 июля 2023, 20:01:15[[ $2 != "zip" && $2 != "cbz" ]]

я вот тут не понмиаю логику.
[[ $2 НЕ РАВНЫ "zip" ОБА ВЫРОЖЕНИЯ РАВНЫ $2 НЕ РАВНЫ "cbz" ]]

Это получатеся что? $2 это zip  НЕ РАВЕН "zip" ОБА ВЫРОЖЕНИЯ РАВНЫ zip НЕ РАВНЫ "cbz"

zip  НЕ РАВЕН "zip" <---- вот тут они равны
zip  НЕ РАВНЫ "cbz"  <---- а вот тут нет
следовательно все оба вырожени не верны. и как это будут работать?
 


25 июля 2023, 22:03:18
Цитировать./.script/aliase_un_arhive /tmp/1/
+ FIND_DIR=/tmp/1/
+ run
+ find_archive
+ for FORMAT in ${ARRAY_FORMAT[@]}
+ IFS='
'
++ find /tmp/1/ -type f '!' -empty '(' -iname '*.zip' ')' -print
+ for FORMAT in ${ARRAY_FORMAT[@]}
+ IFS='
'
++ find /tmp/1/ -type f '!' -empty '(' -iname '*.cbz' ')' -print
+ for FORMAT in ${ARRAY_FORMAT[@]}
+ IFS='
'
++ find /tmp/1/ -type f '!' -empty '(' -iname '*.rar' ')' -print
+ for FILE in $(find "$FIND_DIR" -type f ! -empty \( -iname "*.$FORMAT" \) -print)
++ basename -z /tmp/1/Gnucash.rar
./.script/aliase_un_arhive: line 45: warning: command substitution: ignored null byte in input
+ FILE_NAME=Gnucash.rar
++ dirname -z /tmp/1/Gnucash.rar
./.script/aliase_un_arhive: line 46: warning: command substitution: ignored null byte in input
+ cd /tmp/1
+ uncommpress_file Gnucash.rar rar
+ [[ rar != \z\i\p ]]
+ [[ rar != \c\b\z ]]
+ [[ -f /usr/bin/unzip ]]
+ unzip Gnucash.rar -d Gnucash.rar_
Archive:  Gnucash.rar
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of Gnucash.rar or
        Gnucash.rar.zip, and cannot find Gnucash.rar.ZIP, period.


вот такой лог об ошибке


25 июля 2023, 22:25:59
тему можно закрыть кусок кода переписала вот так. все работает.

Большое спасибо за помощь

if [[ "$2" == "zip" ]] || \
[[ "$2" == "cbz" ]]; then
if [[ -f "/usr/bin/unzip" ]];then
unzip "$1" -d "$1"_ \
&& rm -v "$1"
elif [[ ! -f "/usr/bin/unzip" ]];then
echo -e "nont install unzip apt -y install unzip"
fi
elif [[ "$2" == "rar" ]] || \
[[ "$2" == "cbr" ]]; then
if [[ -f "/usr/bin/unrar" ]];then
mkdir -p "$1"_ \
&& mv "$1" "$1"_ \
&& cd "$1"_ \
&& unrar x "$1" && рм -рф "$1"

Aalexeey

#4
Цитата: zyrHQ от 25 июля 2023, 19:42:23if [[ $2 -eq zip -ne cbz ]]; then
Цитата: dzhoser от 25 июля 2023, 20:01:15[[ $2 != "zip" && $2 != "cbz" ]]
А я бы разделил
if [[ "$2" =~ \.[zZ][iI][pP]$ ]] && [[ "$2" !=~ \.[cC][bB][zZ]$ ]] - если $2 с расширением zip или ZIP и $2 не с расширением cbz или CBZ (но это не логично, может я не понял чего вам надо). Не логично потому что если это zip то он не может быть cbz.
Или if [[ "$2" =~ \.[zZ][iI][pP]$ ]] || [[ "$2" !=~ \.[cC][bB][zZ]$ ]] - если $2 с расширением zip или ZIP или $2 с расширением cbz или CBZ (тут всё логично, но),
короче так if [[ "$2" =~ \.[zZcC][iIbB][pPzZ]$ ]] - если $2 с расширением zip или ZIP или cbz или CBZ.

P.S. сюда загляните https://debianforum.ru/index.php?topic=9141.0
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

zyrHQ

Цитата: Aalexeey от 25 июля 2023, 22:59:19if [[ "$2" =~ \.[zZcC][iIbB][pPzZ]$ ]] - если $2 с расширением zip или ZIP или cbz или CBZ.
Вот тут я не советую так делать. Да, код смотрется компактный. Но потом будут проблемы в его чтении, спустя лет эток 2. Когда вообще не будешь понимать что это за абраривиатура [zZcC][iIbB][pPzZ]. Да и понять потом что тут несколько форматов очень сложно. Лучше точно указывать. Или все вот это перенести массив и обрабтывать там. Да это звучит жутко. Но я каждый раз прихожу к тому мнению что код на этом баше из-за маленького испарвления, проще бросить и начасть писать занова. А вот тут если появится надобность что-то изменить может быть именно такое. А переписывать свой код потому что я не могу его прочитать не хочется. В целом я так и сделала как у тебя в примере. чуть чуть по другому но всеже спасибо.

Aalexeey

#6
Цитата: zyrHQ от 26 июля 2023, 12:23:36[zZcC][iIbB][pPzZ]. Да и понять потом что тут несколько форматов очень сложно.
Сложно кому? Вы поиском в сети пользоваться умеете? Уже с десяток лет эта "схема" работает, это bash!
Цитата: zyrHQ от 26 июля 2023, 12:23:36Вот тут я не советую так делать
Вы здесь советов спрашивать или раздавать?
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

zyrHQ

Цитата: Aalexeey от 26 июля 2023, 13:58:36Вы здесь советов спрашивать или раздавать?

Прошу прощения после чатов привыкла общатся. А не строгой ирерархии форумов

Цитата: Aalexeey от 26 июля 2023, 13:58:36
Цитата: zyrHQ от 26 июля 2023, 12:23:36[zZcC][iIbB][pPzZ]. Да и понять потом что тут несколько форматов очень сложно.
Сложно кому? Вы поиском в сети пользоваться умеете? Уже с десяток лет эта "схема" работает, это bash!



Да я знаю просто потому что  может получится  вот такой монстр
rename  -v -f 's/\.[vVaAmMwWfFoO][kKmMoOvVpPlLgG4][bBmMgGvViI4].web[mM]$/\.webM/' "$FILE_NAME".webM
-_- это пример моего старого кода. Да все в одну строку, да это работает, но это не читабельно. Что если я за хочу убрать скажем  mov формат. Где вероятность что что если я уберу тут  [][][vV] абривиатуру vV  я не сломаю весь скрипт? По этому вот такое я не делаю. из-за этого проще переписать весь баш чем что-то будет править. Вот так писать может повлеч дополнительные ошибки, 

прошу прощения за оффтоп. проблема топика решина

ek-nfn

Цитата: zyrHQ от 26 июля 2023, 14:20:57прошу прощения за оффтоп. проблема топика решина
А что будете делать, если нужный файл (архив) не имеет нужного расширения? Это не винда, тут расширение необязательно. Тип файла определяется не по его расширению.
Debian 12  -> Devuan 5 xfce -> MX Linux 23

Aalexeey

#9
Цитата: zyrHQ от 26 июля 2023, 14:20:57может получится  вот такой монстр
Если оно работает то это хорошо оптимизированный код - занимающий минимально возможное место.
Я бы скорее с $2 и $1 что-нибудь сделал, вот где засада может всплыть.
https://debianforum.ru/index.php?topic=6879 100% защиты от "Ааааа у меня всё поломалось"

zyrHQ

Цитата: ek-nfn от 26 июля 2023, 14:27:18
Цитата: zyrHQ от 26 июля 2023, 14:20:57прошу прощения за оффтоп. проблема топика решина
А что будете делать, если нужный файл (архив) не имеет нужного расширения? Это не винда, тут расширение необязательно. Тип файла определяется не по его расширению.

я уже писала это выше когда говорила про exe, iso и тд. буду ставить проверку типо такой
file Gnucash.rar
Gnucash.rar: Zip archive data, at least v2.0 to extract, compression method=store
на подобии
запрос скрипт: file Gnucash.rar  ты точно rar?
ответ скрипта: нет это не так я zip.
запрос скрипта: отлично тогда распоковывайся по принципу zip

но чаще все такое бывает с образами. из какой-то программы или виртуальной машины типо алкоголь или неро или демолтулс и еще фиг знает какая программа. С такими архивами проблема другая. Если скачиваешь архив из интернета. Всякие winrar 7zip или zip на винде позоваляют сохранить файл в exe. И тут таким способом можно узнать "что ты за файл та, такой". 

ek-nfn

Цитата: zyrHQ от 26 июля 2023, 15:07:53буду ставить проверку типо такой
Код Выделить Развернуть
file Gnucash.rar
Gnucash.rar: Zip archive data, at least v2.0 to extract, compression method=store
Ну тогда сразу и упрощать скрипт, выкидывать ненужную часть, работающую по расширениям. Зачем это дублирование? работайте сразу по выхлопу file
Debian 12  -> Devuan 5 xfce -> MX Linux 23

zyrHQ

#12
Цитата: Aalexeey от 26 июля 2023, 15:01:09
Цитата: zyrHQ от 26 июля 2023, 14:20:57может получится  вот такой монстр
Если оно работает то это хорошо оптимизированный код - занимающий минимально возможное место.
Я бы скорее с $2 и $1 что-нибудь сделал, вот где засада может всплыть.

это точно, я такое страюсь комментировать $2 $1 и что они делают в начале функции. Но по мне хорошо оптимизированный код это код, по меньше динамической типизации. По меньше повторяющегося кода. И чтобы потом можно было лекго переписать или видо изменить. пускай будет строчек по больше. Но зато править проще будет. Хотя что я вообще тут пишу про баш. Но с ним правда бывают проблемы, его править сложно. Особенно если сильно обобщать. Как из моего примера rename

26 июля 2023, 15:20:03
Цитата: ek-nfn от 26 июля 2023, 15:11:43Ну тогда сразу и упрощать скрипт, выкидывать ненужную часть, работающую по расширениям. Зачем это дублирование? работайте сразу по выхлопу file

ну как бы да. Но тут просто был набросок что работает, а что нет. А так да

ek-nfn

Цитата: zyrHQ от 26 июля 2023, 15:17:08ну как бы да. Но тут просто был набросок что работает, а что нет. А так да
Используя стандартные словосочетания из выхлопа file в качестве шаблонов, вам уже не нужен будет if, достаточно будет case, условия ветвления будут легко восприниматься и через 10 лет
Debian 12  -> Devuan 5 xfce -> MX Linux 23