Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Yulia avatar Yulia 1346 Точки

Мда, и аз бях изненадана :D Успях да си кача домашното много по-рано де, но се заиграх доста с bash-а сега и исках да кача по-добра версия ^^

Едит: Благодаря за бързата реакция!

btw, ще се радвам ако някой тества скрипта ми на своята машина, защото не знам дали проверките за съществуването на даден package работят. Понеже ми се е налагало на ръка да променям резолюците на десетки снимки, реших да избера именно този проблем за решаване, а изисква определен package... Та малко прекалих... явно сис-админ не е моята професия - скрипта ми има повече от 10 реда код :D 

Това е първият ми bash скрипт (след "Hello World", разбира се), та всякакъв feedback е добре дошъл. Ровейки из нета попаднах на коренно различен синтаксис, обяснения... та съвсем се обърках с тези единични/двойни кавички и скоби :D И мисленето тук трябва да е съвсем различно. Бих искала да го науча добре, но за момента нямам необходимото време... (а и се изкушавам да постигна същият резултат с node.js. С JavaScript всичко е възможно вече!)

Внимание: Ако имате вече инсталиран imagemagick и ако скриптът работи, той по-подразбиране ще смали всичките .jpg изображения в текущата директория до 1024 пиксела по ширина. Желателно е да го execute-нете в отделна директория.

А като бонус - ако си инсталирате imagemagick все пак, може да подадете аргументи за това какви изображения искате да смалите и до каква ширина ^^ Току-виж, има даже някаква полза от този код за вас xD

Пример:
./resize-images.sh png 600

GitHub: resize-images.sh

PS. А ако ви е много много много скучно, а и ви мързи да тествоте скрипта, напишете sl в терминала и дишайте дълбоко докато влакчето мине ^^ Придава сили ;)

2
02/12/2014 00:42:33
byclops avatar byclops 126 Точки

Пробвах срипта ти на debian със следния резултат:

 

- в debian bash се намира в /usr/bin, така че за да тръгне скрипта, първия ред тряба да е :

#!/bin/bash

или може би по-добре:

#!/usr/bin/env bash

 

- след горната корекция скрипта тръгва и резултата е очаквания, но

- след деинсталация а imagemagick се оказа че проверката за наличността на пакета не сработва (ri-orig.sh: line 18: convert: command not found). Оказва се следната проверка връща винаги true:

if $pkg_available == false;

За да връща коректен резултат го преработих на:

if [[ $pkg_available == false ]];

 

Трябва да призная че и мен синтаксиса на bash скриптовете доста ме обърква. Оказа се че същото нещо може да се напише поне по още няколко начина:

 if [[ $pkg_available = false ]];

 if [ "$pkg_available" == false ];

 if [ "$pkg_available" = false ];

За сега не откривам достатъчно пълно, ясно и систематизирано описание на синтаксиса на bash особено що се отнася до всички варианти на изпозлване на if

- след тази поправка всичко е наред при липса на пакета, но след като го инсталирах наново продължавам да получавам "Error - Imagemagick package didn't found."

Тук се оказа че блока, който проверява наличието на пакета в debian не сработва, но по каква причина още не мога да кажа:)

 

 

 

1
04/12/2014 10:34:47
Yulia avatar Yulia 1346 Точки

О, благодаря за коментара!

Наистина с тези квадратни скобички се обърках доста - изпробвах всички варианти, но явно не съм се спряла на точният :D В тази дискусия в StackOverflow са дадени десетки примери и уж всички работят... хаха

#!/usr/bin/env bash наистина е по-добре - универсално.

За проверките - странно е наистина как първо работи при теб, а после не. Аз пък не успях дори да де-инсталирам пакета, за да проверя как работи при мен. Тази магия не иска да се трие xD Но nevermind...

И тази тема в stack-а е интересна. При някои dpkg -s връща статус код 0 при true и 1 при false. Мистерия за мен. Ти като напишеш dpkg -s imagemagick - какво ти връща като резултат? 

0
04/12/2014 13:31:26
byclops avatar byclops 126 Точки

В крайна сметка намерих добро описание на квадратните скоби (цък) и разбрах защо не се получават проверките. 

Първия if от проверката за debian никога не се изпълнява, понеже командата type интерпретира "dpkg" и "-l" като отделни команди и понеже команда "-l"  няма, проверката винаги fail-ва. Така че го махнах това "-l" и if-a проработи:

(original):

if type "dpkg -l" >/dev/null 2>&1; then

(modified):

if type dpkg >/dev/null 2>&1; then

или може и без type:

if dpkg -l >/dev/null 2>&1; then

 

В слеващия if командата не трябва да е в скоби, така че го модифицирах от:

if ["dpkg -s $pkg"]; then

на:

if /usr/bin/dpkg -s $pkg > /dev/null 2>&1; then

 

Тук се намеси странното поведение на dpkg -s, което ми дава изход 0, незавизимо дали пакета е инсталиран или не. Единствената разлика е в output-a в единия случай ми даава Status: install , а в другия Status: deinstall. Явно има разлика между пакети, които никога не са били инсталирани ( за такива получавам статус 1 ), и такива, които са били деинсталирани. В крайна сметка взех проверката за наличност на инсталиран пакет, описана тук и така нещата потръгнаха:

if dpkg-query -Wf'${db:Status-abbrev}' $pkg 2>/dev/null | grep -q '^i'; then

 

Понеже станаха много промени, това е patch-а, след който проверките вървят правино на моята машина:

@@ -1,4 +1,4 @@
-#!/usr/bin/bash
+#!/usr/bin/env bash

# Using imagemagick package, this script resizes all images in current folder to desired size
# By default, script resizes all jpg images to 1024x768
@@ -35,8 +35,8 @@

function find_package {
# Debian / Ubuntu Linux
- if type "dpkg -l" >/dev/null 2>&1; then
- if ["dpkg -s $pkg"]; then
+ if dpkg -l >/dev/null 2>&1; then
+ if dpkg-query -Wf'${db:Status-abbrev}' $pkg 2>/dev/null | grep -q '^i'; then
pkg_available=true #1
fi
fi
@@ -56,7 +56,7 @@
fi

# At least - the "command not found" errors are not visible ^^
- if $pkg_available == false; then
+ if [[ $pkg_available = false ]]; then
echo "Error - Imagemagick package didn't found."
exit;
else

 

Според мен и проверките за другите дистрибуции трябва да се променят по подобен начин за да работят. Ако искаш да тестваш без да деинсталираш imagemagick, можеш да смениш съдържанието на $pkg на imagemagick1 например и готово :)

  

1
Yulia avatar Yulia 1346 Точки

Супер! Благодаря,  byclops  ^^ 

0
05/12/2014 16:41:58
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.