bash proggizás

Sziasztok!

Segítsetek egy kicsit nekem légyszi.
Hogyan tudom bash-ben egyszerűen eldönteni, hogy az egyik sztring prefix-e egy másiknak vagy sem?
Íme a próbálkozás:


if [[ "$hosszu" =~ "^${prefix}.*" ]];
...

De nem megy, ez mindig hamis. Ha nem változót írok jobb oldalra, hanem fix sztringet akkor jó.

Köszi,
D.

Hozzászólások

Na most valami beugrott... biztos a $ nem jó neki, mert regexben
a sztring végére illeszkedik.

hosszu=-r
prefix=-r
if echo "X$hosszu" | grep -q "^X$prefix"
then
 blabla
fi

if [[ "X$hosszu" =~ "^X$prefix" ]] ; then echo almafa ;else echo kortefa ;fi


#!/bin/bash

hosszu='toltottkrumpli'
prefix1='tolt'
prefix2='nemtolt'

function is_prefix_of()
{
  local pfx=${!2};
  test "${!1:0:${#pfx}}" = "$pfx";
}

if is_prefix_of hosszu prefix1;
then
  echo "igen";
else
  echo "nem";
fi;

(is_prefix_of hosszu prefix2 && echo "igen") || echo "nem";

huh, ez kicsit magas nekem, főleg a föggvény/szubrutin belseje...
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 12.0 | 2.6.24.4-janos

Megvan!
Nem a ! jel volt a gáz, mert az event designator script módban ki is van kapcsolva, hanem egy nyitó '['.
Tehát a hasonlítás előtt:

`echo "$hosszu" | sed -e 's/\[/\\\[/g'`

És megy!
Köszi mindenkinek!

Hello

Kicsit buta kérdésem:
Milyen paranccsal lehet egy fájlhoz hozzáirni valamit? Mondjuk egy másik fájlt, vagy a standard bemenetről.

Köszi a választ

Én így szoktam:
if [ "${hosszu#$rovid}" != "$hosszu" ]; then
echo prefix
else
echo nem prefix
fi

A ${valtozo#sztring} konstrukció a változó értékének elejéről csippenti le a sztringet, ha tudja, és a maradékot adja vissza. Ha nem tudta, visszaadja a változó teljes értékét. A kód hibásan működik, ha a rövid sztring üres, erre külön rá kell még ellenőrizni...


a="almabelmacelma" ; 
b="almabe" ; 
echo "$a" | awk -v v="$b" '{ if( index($1,v) == 1 ) {printf "PREFIX: "v"\n";}}'

Hali.
Nem tudom, nekem a kovetkezo scriptecske mintha jol mukodne bash-al:

_prefix()
{
    echo $hosszu =~ "^$prefix.*"
    if [[ "$hosszu" =~ "^${prefix}.*" ]]
    then
        echo '  :-)'
    else
        echo '  Uhhh'
    fi
}

hosszu="kukac.mano.lo"
pre1="kukac."
pre2="kikic."

prefix=$pre1
_prefix
prefix=$pre2
_prefix

Ami szerintem a regexp-nel problemat okozhat, ha a prefix-ed tartalmaz pontot, plusszt, stb regexp metakaraktert...

Zsiraf

Ezt most komolyan kerdezted?

http://www.gnu.org/software/bash/manual/bashref.html


...
[[...]]
     	

    [[ expression ]]

    Return a status of 0 or 1 depending on the evaluation of the conditional
    expression expression. Expressions are composed of the primaries described
    below in 6.4 Bash Conditional Expressions. Word splitting and filename
    expansion are not performed on the words between the `[[' and `]]'; tilde
    expansion, parameter and variable expansion, arithmetic expansion, command
    substitution, process substitution, and quote removal are performed.

Zsiraf

Komolyan, ui. :

fules@chaos:~$ if [[ "asdf" =~ "^a" ]]; then echo "igen"; else echo "nem"; fi
bash: conditional binary operator expected
bash: syntax error near `=~'
fules@chaos:~$ bash --version
GNU bash, version 2.05b.0(1)-release (i386-pc-linux-gnu)
Copyright (C) 2002 Free Software Foundation, Inc.

legalábbis ennél a bash-verziónál az '=~' operátor nem tűnik érvényesnek, a 'test' parancsnál sem, egyik manpage sem írja, sőt mi több, a 'regular' szó is csak a 'regular file' összetételben szerepel, a 'regex' pedig abszolute nem.
Te milyen verziójú bash-t használsz?

http://en.wikipedia.org/wiki/Bash#In-process_regular_expressions


...
In-process regular expressions

bash 3.0 supports in-process regular expression matching using the following syntax, reminiscent of Perl:

[[ string =~ regex ]]
...

Zsiraf

p.s.: ja, a 3.0 mar 2004-Aug-03 ota elerheto az ftp.gnu.org-rol... :-)

Erdekelne, hogyan tudom ellenorizni, hogy pl. letezeik-e *valami*?
if [ -f *valami* ]-ra pofazni fog. Van otletetek? ha idezojelbe teszem, akkor mindig hamis lesz.

Koszi elore is.

---
Hey! Where'd my terminal go?

Elvileg minden olyan dolog jó lehet, ami vagy visszatérési értékkel vagy az outputjával jelzi a létezést.

Példák:

  if find *valami* -maxdepth 0 2>/dev/null >&2; then ...
  if stat *valami* 2>/dev/null >&2; then ...
  if ls *valami* 2>/dev/null >&2; then ...

Vagy ugyanezek másképpen:

  [ "$(find *valami* -maxdepth 0) 2>/dev/null" ]
  [ "$(stat *valami* 2>/dev/null)" ]
  [ "$(ls *valami* 2>/dev/null)" ]

Sziasztok!

Triviális kérdés.
Hogyan tudok két műveletet összevonni?

Konkréten egy kis iso mountoló/unmountoló scriptről lenne szó:

#!/bin/bash
if [ -d "/mnt/dvd/" ]; then
	gksu umount "/mnt/dvd/" 
	gksu rmdir "/mnt/dvd/"
	Xdialog --title "MountISO" --msgbox "ISO lecsatlakoztatva" 5 60
else
	if [ -e "$1" ]; then
		gksu mkdir "/mnt/dvd" 
		gksu "mount -o loop -t iso9660 '$1' '/mnt/dvd/'"
		thunar "/mnt/dvd/"
	fi
fi

Ez így működik, csak egy leválasztáshoz vagy csatlakoztatáshoz kétszer kéri be a jelszót, ezért szeretném egy egy gksu alá vonni a 4 műveletet.

Elején én is azt hittem, hogy nem kell.
De a leválasztáshoz meg kell nézni, hogy van-e /mnt/dvd/,ha van akkor umount, ha nincs akkor mount. Ha nem lenne rmdir és mkdir akkor csak egy művelet hajtódna végre, az umount.
Egyébként nincs -c opciója a gksunak.

Szerk.:
Thunarban csináltam egy új műveletet az umountnak, aztán csináltam egy másik scriptet. Már csak annyi a szépséghiba, hogy akkor is kiírja lecsatlakoztatva szöveget, ha mégsemre nyomok jelszóbeírásnál. :)

Sziasztok.

Bash programozást tanulok egy redhat referenciából. A könyvbe az van, hogy a
set -o noclobber paranccsal bekapcsolom, hogy ne írja felül az állományt ha erre parancsot adok. De kivétel ha >! kimenetet használok, mert az felülírja a noclobbert. Ehhez képest ezt a választ kapom >! esetén: "bash: !: cannot overwrite existing file
" Ha kikapcsolom a noclobbert (set +o noclobber) akkor engedi.

Mi a baj? vagy régi a referencia és ez már nem élő dolog?