Pisanje kratke bash komande

1

Pisanje kratke bash komande

offline
  • Pridružio: 11 Okt 2014
  • Poruke: 344

Možete li mi pomoći oko pisanja ove bash skripte?

Napisati BASH Shell skriptu koja prima dva parametra: ime datoteke i ime direktorija.
Prijaviti grešku ako nema dva parametra ili ako prvi nije datoteka ili ako drugi nije direktorij. Ako su parametri korektni, skripta treba da iskopira datoteku u navedeni direktorij.
Probati izvršenje skripte sa
chmod 755 testcopy
./testcopy dat1 /tmp
i još nekim parametrima



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12365
  • Gde živiš: Južni pol

Jesi li pokušao sam da rešiš zadatak?

Citat:Prijaviti grešku ako nema dva parametra ili ako prvi nije datoteka ili ako drugi nije direktorij.

Ovo ti sadrži gotovo ceo zadatak. Da bi prijavio grešku, moraš da testiraš ove situacije.

Pseudokod
Ako broj parametara nije jednak 2 -> onda napiši grešku
U suprotnom:

   Ako prvi parametar nije datoteka -> onda napiši grešku
   U suprotnom,

           Ako drugi parametar nije direktorijum -> onda napiši grešku
           U suprotnom

                 Iskopiraj datoteku iz parametra 1 u direktorijum iz parametra 2

            Kraj Ako bloka

    Kraj Ako bloka

Kraj Ako bloka


Pogledaj sledeće info strane za više informacija (pod Linuksom, FreeBSD-om, MacOS-om, WSL-om na Windowsima 10 i 11, itd):
info bash if
info bash test
info coreutils echo
info coreutils cp



offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3714
  • Gde živiš: 127.0.0.1

Blizu bocke, ali stativa. Da ne gresim dusu, i ja sam pisao ovakav kod (ispravan, da se razumemo) dok nismo uveli automatizovane testove. Tek onda shvatis koliko nestovani if-ovi prave sr... problem.

Potpuno isti kod, samo malo bolje organizovan:

Ako broj parametara nije jednak 2 -> onda napiši grešku i napusti izvrsavanje (return, exit, die...)
Ako prvi parametar nije datoteka -> onda napiši grešku i napusti izvrsavanje
Ako drugi parametar nije direktorijum -> onda napiši grešku i napusti izvrsavanje
Iskopiraj datoteku iz parametra 1 u direktorijum iz parametra 2


Broj testova za bocketov kod: 16
Broj testova za kod koji radi isto to, samo malo drugacije: 4

offline
  • Pridružio: 06 Feb 2012
  • Poruke: 1859

Inače, ovo se zove "Guard Clauses".

Više o ovome:
https://betterprogramming.pub/refactoring-guard-clauses-2ceeaa1a9da
https://blog.webdevsimplified.com/2020-01/guard-clauses/
https://wiki.c2.com/?GuardClause

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12365
  • Gde živiš: Južni pol

Napisano: 31 Maj 2022 21:55

@Rasta:

Opa, savet iz prakse. Smile

Šta koristite za auto-testiranje Bash skripti? Neki frejmvork?

Ima smisla. Pošto je kod dosta razgranat. Tražio sam malo na netu i nisam našao nešto konkretno. Ljudi više gledaju iz ugla čitljivosti, nego ciklusa. Ali to je vrlo validna kritika u praksi. Wink

Dopuna: 31 Maj 2022 22:07

Sale.S ::Inače, ovo se zove "Guard Clauses".

Više o ovome:
https://betterprogramming.pub/refactoring-guard-clauses-2ceeaa1a9da
https://blog.webdevsimplified.com/2020-01/guard-clauses/
https://wiki.c2.com/?GuardClause


Interesantna literatura. Preporuka za sve koji preskoče post.

Doduše, pošto je ovo domaći zadatak najbolje bi bilo da rešenje liči na ono o čemu se pričalo na času/predavanjima ili onome što se radilo na vežbama. Smile

Profesori i asistenti znaju ponekad da budu vrlo rigidni kad su rešenja u pitanju.

offline
  • Pridružio: 11 Okt 2014
  • Poruke: 344

Hvala puno svima, ovo je neki pokušaj:

#!/bin/bash

if [[ $# -ne 2 ]]; then
   echo "Broj argumenata treba biti 2";
   exit 1;
else
   if [[ ! -f $1 ]]; then
      echo "Prvi argument nije datoteka";
      exit 1;
   fi
   if [[ ! -d $2 ]]; then
      echo "Drugi argument nije direktorij";
      exit 1;
   fi
   cp $1 $2/
fi

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14722
  • Gde živiš: Niš

Kao što u primeru druga dva uslovna grananja nisi imao potrebu za else granom, tako nema potrebe za else granom nakon prvog uslovnog grananja. Baš ovo što kolege iznad govore.

Inače pokušaj deluje okej. Jel radi?

offline
  • Pridružio: 11 Okt 2014
  • Poruke: 344

mislim da radi, ako sam dobro testirao, ali meni se ovaj stil pisanja nikako ne dopada, navikao sam da imam zagrade u if else kondicionalima (c,c++,javascript...), ovako je baš teško za razumeti

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14722
  • Gde živiš: Niš

Ustvari je lakše, samo dok se privikneš na stil.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3714
  • Gde živiš: 127.0.0.1

@bocke

Ne pisem ja bash skripte, osim kad moram Smile PHP mi je primarni jezik, a tu koristimo PHPUnit (uz mali synthetic sugar frejmvorka koji koristimo).

Ako se ne varam, broj ciklusa u oba slucaja je u potpunosti isti. Testova nije. Svaki if-else povecava broj scenarija koje moras da pokrijes 2x, a nest-ovana if-else grananja to rade eksponencijalno.

Ko je trenutno na forumu
 

Ukupno su 842 korisnika na forumu :: 57 registrovanih, 7 sakrivenih i 778 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: -[CoA]-, Acaks88, amaterSRB, babaroga, backobaculoni, bladesu, bojank, Boris Bosiljčić, cavatina, cenejac111, comi_pfc, crnitrn, darios, ddjxxi, Denaya, DonRumataEstorski, dragan_mig31, draggan, dragoljub11987, Ehinacea, FileFinder, Georgius, Goran 0000, ILGromovnik, Insan, ivan979, Joja, JOntra, kairos, kunktator, Leonov, LUDI, m0nstrum_, mane123, MB120mm, MilosKop, Miskohd, mkukoleca, NiNo_8824, pandur, pericanet, promajauglavi, Rocker, S2M, sabros, saputnik plavetnila, slonic_tonic, Steeeefan, StefanopuloZ, tubular, VladaNS1978, Voja1978, wulfy, Yonesky, yrraf, zixmix, zlaya011