Nowe posty

Autor Wątek: Skrypt "kolejkowy"  (Przeczytany 4932 razy)

rkaminski

  • Gość
Skrypt "kolejkowy"
« dnia: 2008-11-29, 03:07:20 »
Witam wszystkich,

Mam taki oto problem. Napisałem sobie skrypt w bashu (nazwałem go q), który po podaniu mu odpowiedniej nazwy jako argumentu tworzy odpowiedni katalog, wgrywa tam odpowiednie pliki i tworzy tzw. skrypt kolejkowy a potem to wszystko uruchamia. Chodzi o pewne zagadnienia dotyczące uruchamiania programu do obliczeń kwantowych. Tak czy siak mój skrypt wygląda mniej więcej tak:

#!/bin/bash
nazwa=$1
cd /scratch/rkami/adf/
mkdir $nazwa
cp /scratch/rkami/adf/$nazwa.run /scratch/rkami/adf/$nazwa/$nazwa.run
cd /scratch/rkami/adf/$nazwa
touch $nazwa.sh
echo caly odpowiedni tekst >$nazwa.sh
qsub -N $nazwa -q parallel -l ncpus=4 ./$nazwa.sh

Uruchamia się go np. ./q cos. Wtedy oczywiście tworzą mi się odpowiednie katalogi o nazwie cos i tak dalej. Pomyślałem sobie zatem, że trochę męczące by było uruchamiać to za każdym razem i po prostu skonstruować odpowiednią pętlę i podać skryptowi odpowiednią ilość argumentów. Próbowałem taką pętlę skonstruować ale jakoś mi to nie wychodziło. Chodzi o to, że jak mu napiszę np.

./q cos1 cos2 cos3

to wykona tą czynność 3 razy zmieniając odpowiednio zmienną "nazwa" na cos1, cos2, cos3 i na tym skończy.

Byłbym wdzięczny za pomoc w zaimplementowaniu tej pętli. Myślałem nad pętlą until, ale nie wiem jak w bashu zrobić aby automatycznie liczył wpisane parametry.

Z góry dziękuję za pomoc

arctgx

  • Gość
Skrypt "kolejkowy"
« Odpowiedź #1 dnia: 2008-11-29, 03:47:01 »
Myślę, że zainteresuje Cię zmienna @ zawierająca wszystkie parametry pozycyjne:

f1() { for i in "$@"; do echo ${i}; done; }
Zamiast echo dajesz kod swojego programu ujętego jako inna jeszcze funkcja w skrypcie. Mam nadzieję że to wystarczy.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Skrypt "kolejkowy"
« Odpowiedź #2 dnia: 2008-11-29, 11:45:10 »
Zwrócę tylko uwagę na polecenie shift, którym również można rozwiązać ten problem.

#!/bin/bash
while [ "$1" != "" ]; do
  nazwa="$1"
  ...
  ...
  ...
  shift
done
PS. Polecam stosować "" do wszystkich zmiennych, które mogą być pustym ciągiem znaków.

arctgx

  • Gość
Skrypt "kolejkowy"
« Odpowiedź #3 dnia: 2008-11-29, 14:52:36 »
Cytat: ultr
Polecam stosować "" do wszystkich zmiennych, które mogą być pustym ciągiem znaków.
Nie ma bardziej przekonującego sposobu jak pokazać to na parze przykładów z cudzysłowem i bez :)

Skoro już o pustych ciągach znaków, to zastanawia mnie od jakiegoś czasu, dlaczego twórcy skryptów unikają z nimi porównań. Np. w skrypcie GRUB-a 1.96 do tworzenia grub.cfg mamy taki trik:

if [ "x${GRUB_DEFAULT}" = "x" ] ;
case x${GRUB_TERMINAL_OUTPUT} in
 xgfxterm)
Chciałbym samodzielnie znaleźć lub dostać od kogoś przykład obrazujący, co mogło dziać się bez tego obejścia.

rkaminski

  • Gość
Skrypt "kolejkowy"
« Odpowiedź #4 dnia: 2008-12-10, 18:42:58 »
Cytat: arctgx
Myślę, że zainteresuje Cię zmienna @ zawierająca wszystkie parametry pozycyjne:

f1() { for i in "$@"; do echo ${i}; done; }
Zamiast echo dajesz kod swojego programu ujętego jako inna jeszcze funkcja w skrypcie. Mam nadzieję że to wystarczy.
Hmm, mówisz aby zrobić kod programu jako funkcję. Cóż, nie znam po prostu innej możliwości jak wpisywania czegoś do pliku niż echo -e itp.

Innymi słowy jak można zrobić coś takiego, że chcę mieć plik o zawartości:

$1
$2
$3

rozumiem wtedy, że jak wcześniej zdefiniuję funkcję to potem w skrypcie wywołam ją z parametrami 1 2 3 i będę miał co trzeba, ale jak to zrobić to nie mam pojęcia... a to faktycznie dużo by uprościło.

Z góry dziękuje za pomoc

arctgx

  • Gość
Skrypt "kolejkowy"
« Odpowiedź #5 dnia: 2008-12-10, 19:23:44 »
Chodzi Ci o takie coś:
f1() { PLIK="./nazwa"; for i in "$@"; do echo ${i}>>$PLIK; done; }
?
Podwójny znak przekierowania dopisuje wyjście na koniec zadanego pliku, pojedynczy nadpisuje (czyli czyści i pisze od nowa). Zobacz jak zadziała f1 xx yy zz.

rkaminski

  • Gość
Skrypt "kolejkowy"
« Odpowiedź #6 dnia: 2008-12-11, 22:39:28 »
Hmm, na razie nie mogę sprawić czy działa, ale ogólnie chodzi o to aby zamiast wpisywać:

touch nazwa.cos
echo -e cos_wpisane 1 \\ncos_wpisane 2 \\n > nazwa.cos

chcę mieć coś takiego w kodzie gdzie będę miał jawnie wpisane

cos_wpisane 1
cos_wpisane 2
cos_wpisane 3

i to jako jakaś funkcja danych parametrów, które są potem dokładnie tak wpisywane do pliku. Chodzi ogólnie o to aby zamiast wpisywać echo -e coś tam i się robi strasznie długa linijka było to wpisane normalnie.