Problema konyvtar kiiratassal bash script-ben

Sziasztok!

Van egy baratom, aki az alabbi anomalian tori a fejet:

Van egy egyszeru szkript:

#!/bin/bash

for file in `ls $1`; do
echo $file
if [ -f $file ] ; then
echo "$file egy file"
fi
if [ -d $file ] ; then
echo "$file egy konyvtar"
fi
done

En nem ertek a bash szkriptekhez, a srac problemaja, hogy ha a szkriptnek parameterkent a jelenlegi konyvtarat adja meg, akkor az if-ek rendesen kiirjak, ha vmi konyvtar v. file. Ha barmely mas konyvtarat adunk meg, akkor nem irja ki, hogy konyvtarrol vagy fajlrol van szo.

Meg tudnatok mondani, hogy ez miert van?

Koszonom!

Hozzászólások

A haverom tudja, hogy hogyan lehet mukodesre birni a szkriptet (cd $1), viszont az erdekli, es nem talalt meg ra valaszt, hogy a fentebb emlitett szkript miert rossz.

Koszonom

#!/bin/bash

if [ "$1" != "" ]; then
mit=$1
fi
for file in `ls $mit`; do
echo "$mit$file"
if [ -f "$mit$file" ] ; then
echo "$mit$file egy file"
fi
if [ -d "$mit$file" ] ; then
echo "$mit$file egy konyvtar"
fi
done

Ezt próbálja ki a haver! Szintaxis: script.sh konyvtar/
Kell a / a végén!
--
Coding for fun. ;)

"Ezt próbálja ki a haver! Szintaxis: script.sh konyvtar/
Kell a / a végén!"

Nem tárgya a problémának, de ezt most mééééér?

Ha a $mit és $file közé bekerül a / ($mit/$file), akárhogy is meg lehet hívni, lévén a /-ek száma lényegtelen, ha >=1, vagyis ha konyvtar/ alaku a parameter, az sem art.

Ez nonszensz volt. De a kedvedért módosítom a scriptet, ok?

#!/bin/bash

if [ "$1" != "" ]; then
mit=`echo "$1/" | sed s/'\/*$'/'\/'/g`
fi
for file in `ls $mit`; do
echo "$mit$file"
if [ -f "$mit$file" ] ; then
echo "$mit$file egy file"
fi
if [ -d "$mit$file" ] ; then
echo "$mit$file egy konyvtar"
fi

Így már nem kell a /
--
Coding for fun. ;)

Nem kéne vitába bonyolódnom, de tisztázzunk egy dolgot...

Ha paraméter nélkül futott volna le az 1. verzió, és az általad javasolt "$mit/$file" alakot választjuk, a script a $mit hiányában a "/$file" alakot vizsgálta volna. Ebben az esetben viszont hibás lenne az eredmény.
Mivel nem volt kedvem hibakezelést beleépíteni, példaként anélkül írtam le. A paraméter nélküli futtatáskor így a "$file" nem módosul, tehát nem okoz gondot.

A második verzió azonban kiküszöböli a "/" elhagyhatatlanságát a paraméter esetében. ("/"-rel vagy anélkül: a script helyesen fogja kezelni.)

Remélem, világos volt, és nem kell további köröket futnunk.
--
Coding for fun. ;)

Vajon miért van for file in `ls $1` ott, ahol for file in "$@" kellene legyen?