Command Line Shells - Изпуснат срок
Здравейте!
Готов съм с домашното по "Command Line Shells" и мислих, че срока е до 00:00, ще може ли да го удъжите до 00:00.
Поздрави,
Димитър!
Здравейте!
Готов съм с домашното по "Command Line Shells" и мислих, че срока е до 00:00, ще може ли да го удъжите до 00:00.
Поздрави,
Димитър!
Мда, и аз бях изненадана :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
PS. А ако ви е много много много скучно, а и ви мързи да тествоте скрипта, напишете sl в терминала и дишайте дълбоко докато влакчето мине ^^ Придава сили ;)
Пробвах срипта ти на 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 не сработва, но по каква причина още не мога да кажа:)
О, благодаря за коментара!
Наистина с тези квадратни скобички се обърках доста - изпробвах всички варианти, но явно не съм се спряла на точният :D В тази дискусия в StackOverflow са дадени десетки примери и уж всички работят... хаха
#!/usr/bin/env bash
наистина е по-добре - универсално.За проверките - странно е наистина как първо работи при теб, а после не. Аз пък не успях дори да де-инсталирам пакета, за да проверя как работи при мен. Тази магия не иска да се трие xD Но nevermind...
И тази тема в stack-а е интересна. При някои dpkg -s връща статус код 0 при true и 1 при false. Мистерия за мен. Ти като напишеш dpkg -s imagemagick - какво ти връща като резултат?
В крайна сметка намерих добро описание на квадратните скоби (цък) и разбрах защо не се получават проверките.
Първия 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 например и готово :)
Супер! Благодаря, byclops ^^