Hirdetés

2024. április 26., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Bash script

Hozzászólások

(#1) Briganti


Briganti
tag

Pliiiiz ne zarjatok, holnap nagy szuksegunk van ra, utanna igerem hogy en zarom, KOSZI :R

If debugging is a process of removing bug, then programming is a process of putting them in ...

(#2) Jester01 válasza Briganti (#1) üzenetére


Jester01
veterán

Jó hát biztos megvan rá az okod, de miért is nem volt jó a "nagy shell script topik" :F

Jester

(#3) jancsika.kis


jancsika.kis
csendes tag

adott egy allomany kov szerkezettel: nev keresztnev jegy(1<>10) csoportositsuk a szemelyeket jegy szerint es irjuk ki jol lathatoan
help!

(#4) jancsika.kis


jancsika.kis
csendes tag

ez eken de linuxban ... #!/bin/bash

(#5) Darth_Revan


Darth_Revan
veterán

Hi!
Tudna nekem mondani valaki egy egyszerű parancsot amivel meg tudom határozni (awk nélkül) egy xy könyvtáron belül levő fájlok átlag méretét egészre kerekítve? Thx :)

[ Szerkesztve ]

(#6) Jester01 válasza Darth_Revan (#5) üzenetére


Jester01
veterán

Például:

sum=0
count=0
for size in $(find "$1" -maxdepth 1 -type f -printf "%s ")
do
sum=$((sum + size))
count=$((count + 1))
done
echo "$sum bytes in $count files, averaging $((sum / count)) bytes per file"

MOD: persze nullával osztást illene ellenőrizni :B

[ Szerkesztve ]

Jester

(#7) TrakToros


TrakToros
csendes tag

hello!
Nekem is volna 1 gondom.

Megoldottam, hogy kimenetre kimenjen 4 db számjegy és azt kellene összeadni és átlagolni. Segítene valaki? Köszönöm.

A traktorosok,kombájnosok jó emberek:)

(#8) Jester01 válasza TrakToros (#7) üzenetére


Jester01
veterán

Hát ez ugyanaz a probléma mint fentebb :K

Jester

(#9) TrakToros válasza Jester01 (#8) üzenetére


TrakToros
csendes tag

csak az nekem nem igazán akar működni :(

Leírom inkább az egész feladatot:

Írjon bash scriptet, amely az első pozícionális paraméterben megadott könyvtárban meghatározza
az olvasható fájlok átlag méretét bájtban (egészre kerekitve). A paraméterül kapott könyvtár létezését ellenőrizze,
és térjen vissza hibás (2) kóddal ha nem létezik. Ha nincs megadva paraméter, írjon ki rövid ismertetőt a használatról
és térjen vissza hibás (1) kóddal. Az eredmény egész számot (átlag) írja ki egy log.txt nevű fájlba.
A feladat megoldása során a "test", "expr", "ls", "cat", "echo", "cut", és "find" segédprogramokat használja.

A feladat eleje hiányzik már csak, mert addig sikerült megcsinálnom, hogy kilistázza egy mappán belül levő fájlok méretet, jelenleg csak azok jelennek meg a kimeneten, már csak összegezni és átlagolni kellene őket. Bár nem tudom többi rész is jó-e, mert "test,"expr" és "cat" parancsokat még nem használtam, ebbe a maradék részben kellene használni ezt a 3at? :U

Ezt csináltam eddig:

if [ -z "$1" ]
then
echo "Nem adtál meg könyvtár nevet! Kérlek add meg!"
exit 2
fi

a=`find / -name $1 2>/dev/null`

if [ -d "$a" ];
then

for fn in $a

do
for i in "$fn"/*.*
do
b=`ls -ltr $i`
echo $b|cut -d " " -f 5


done
done

else
echo "Nem található ez a mappa!"
fi

[ Szerkesztve ]

A traktorosok,kombájnosok jó emberek:)

(#10) TrakToros válasza TrakToros (#9) üzenetére


TrakToros
csendes tag

már mind1, megcsináltam :B

A traktorosok,kombájnosok jó emberek:)

(#11) Darth_Revan válasza Jester01 (#6) üzenetére


Darth_Revan
veterán

Köszi, hasznos volt :R

(#12) Darth_Revan


Darth_Revan
veterán

Üdv

Azt hogy lehetne megcsinálni, hogy kilistázok több db html fájlt és azokban megszámolni, hogy hány db sor van a <body> és </body> között? Próbáltam volna grep-el de csak egy sort számnolt, a <body>-t :(

(#13) Jester01 válasza Darth_Revan (#12) üzenetére


Jester01
veterán

sed -n '/<body>/,/<\/body>/ p' | wc -l
Ez beleszámolja a body sorokat is, tehát kettővel több lesz. Már ha volt body egyáltalán.

Vagy awk-val:
awk '/<body>/,/<\/body>/ { count++ } END { if (count > 2) print count - 2; else print 0 } '

vagy shellben közvetlenül:

count=0
body=0
while read line
do
test "x$line" != "x${line/<body>/}" && body=1 && continue
test "x$line" != "x${line/<\/body>/}" && body=0 && continue
[[ $body == 1 ]] && count=$((count + 1))
done
echo $count

Egyik sem szereti ha egy sorban van a <body> és a </body> :) És ha nincs </body> akkor is "között"-nek minősül.

Jester

(#14) Darth_Revan válasza Jester01 (#13) üzenetére


Darth_Revan
veterán

awk-val csak 0-t ír ki :(

(#15) Darth_Revan válasza Darth_Revan (#14) üzenetére


Darth_Revan
veterán

sed-el meg csak az egyik body-t számolja bele :B

(#16) Jester01 válasza Darth_Revan (#14) üzenetére


Jester01
veterán

Tudsz adni egy példát?

Jester

(#17) kovacsakos91


kovacsakos91
csendes tag

Valaki esetleg tudna ajánlani valamiféle szakirodalmat vagy példatárat a témában?

(#18) Jim-Y


Jim-Y
veterán

Sziasztok

van egy változóm benne floatok, ezeket szeretném összeadni, már legalább 20-féleképp próbáltam de eddig semmi :/

"a" a változó
"sum"-ba kéne összeadogatni az "a"-ban lévő floatokat (pl 56.45,65.32 stb..)

for i in $a
do
`sum+=$i | bc`
done

megköszönném ha valaki tudna segíteni :R

(#19) Jim-Y válasza Jim-Y (#18) üzenetére


Jim-Y
veterán

ez sem jó :(

sum=$(echo "$sum+$i" | bc)

[ Szerkesztve ]

(#20) Jim-Y válasza Jim-Y (#19) üzenetére


Jim-Y
veterán

Ha esetleg érdekel valakit, végül felba***, szóval felidegesítettem magam, és hagytam a fenébe a bashscriptet, és perlben oldottam meg, lám ott tök triviálisan ennyi volt:

$sum=0.0;
foreach(@ssr){
$sum+=$_;
}

-.-

(#21) Jester01 válasza Jim-Y (#18) üzenetére


Jester01
veterán

Ha vesszővel vannak elválasztva, akkor pl.:

a="56.45,65.32,12.34"
sum=$(echo ${a//,/+} | bc)

Jester

(#22) devbence válasza Jim-Y (#20) üzenetére


devbence
tag

lol :C

"az erzelem szamomra fontos dolog.. pl: erzem ha ehes vagyok"

(#23) Ronny3


Ronny3
aktív tag

Valaki tud esetleg segíteni ebben:

Egy VB Sript-et kellene írni ,, , ami az Fn+F3 gombokra vonatkozna ACER TM8571 Notebookra,és azt az utasítást adja a gépnek induláskor, mintha benyomtam volna az Fn+F3-as gombot... Ami egyébként a Bluetooth-ot kapcsolja be!

A VB Scrip-tel az autómatikus Bluetooth bekapcsolását szeretném megoldani, hogy ne keljen mindig bekapcsolgatni ujraindítás után!

Köszönöm ha tud valaki érdemben segíteni!

(#24) sonar válasza Ronny3 (#23) üzenetére


sonar
addikt

Bash <>Batch
szerintem benézted a topicot

A tudást mástól kapjuk, a siker a mi tehetségünk - Remember: Your life – Your choices!

(#25) F34R


F34R
nagyúr

nem tudom hogy ismeretek-e ilyet de szuksegem volna olyan scriptre mint flac>mp3 eseteben:

#!/bin/bash

for a in *.flac; do
< /dev/null ffmpeg -i "$a" -qscale:a 0 "${a[@]/%flac/mp3}"
done

namarmost nekem musepack (*mpc)-bol kellene mp3-t varazsolni.
fent van a decoding library a libmpcdec is. valakinek valami otlete ?

(#26) F34R válasza F34R (#25) üzenetére


F34R
nagyúr

Naj csak meglett.

lame, mutagen, mplayer (vagy tetszes szerint mplayer2 es a fork mpv)

es a script

#!/bin/bash

DEFAULT_OUTPUT_DIR=/tmp/mp3ify
QUALITY=2
VBR_QUALITY=4
MIN_BITRATE=64
MAX_BITRATE=256
SAMPLE_FREQ=44.1


function any_to_mp3 {

PIPE=`mktemp -u -t mp3ify.pipe.XXXXXX`
mkfifo "$PIPE"

mplayer -ao pcm -ao pcm:file="$PIPE" "$INPUT_FILE" -noconsolecontrols > /dev/null 2>&1 &

lame -m j -q $QUALITY -v -V $VBR_QUALITY -b $MIN_BITRATE \
-B $MAX_BITRATE -s $SAMPLE_FREQ "$PIPE" "$OUTPUT_FILE" > /dev/null 2>&1

rm "$PIPE"

python2 -c "
import mutagen
input = mutagen.File(\"$INPUT_FILE\", easy = True)
output = mutagen.File(\"$OUTPUT_FILE\", easy = True)
for tag in [ 'artist', 'album', 'tracknumber', 'date', 'genre', 'title', 'comment' ]:
value = input.get(tag)
if value: output[tag] = value[0]
output.save(v1=2)"
}


function usage {

echo "mp3ify <input_dir> [<output_dir>]

Transforms structure <input_dir>/X/Y/.../Z into structure <output_dir>/X/Y/.../Z
according to the following rules:

flac, ogg, m4a, ape, aac, mpc files will be encoded to mp3 preserving tags.

Everything else will be copied without modification.

Requires: mplayer, lame, mutagen.
"
exit 1
}


INPUT_DIR="$1"
[ -d "$INPUT_DIR" ] || usage
OUTPUT_DIR="${2:-$DEFAULT_OUTPUT_DIR}"

find "$INPUT_DIR" -name '*.*' | while read INPUT_FILE
do
INPUT_EXTENSION="${INPUT_FILE##*.}"
OUTPUT_FILE="$OUTPUT_DIR/${INPUT_FILE#$INPUT_DIR}"
mkdir -p "`dirname "$OUTPUT_FILE"`"

case $INPUT_EXTENSION in
flac|m4a|ogg|ape|aac|mpc)
OUTPUT_FILE="${OUTPUT_FILE%.$INPUT_EXTENSION}.mp3"
echo -n "Converting ${INPUT_FILE##*/}... "
any_to_mp3
;;
*)
echo -n "Copying ${INPUT_FILE##*/}... "
cp "$INPUT_FILE" "$OUTPUT_FILE"
;;
esac

echo "done."
done

(#27) dkaro


dkaro
őstag

Sziasztok!
Nagyon láma vagyok bash-ben de nagioshoz szükségem van néhány scriptre.
Egy ubiquity eszközről ssh-val kell leszednem 2 infot.
Ezt a scriptet írtam (nem kiröhögni ha nagy hülyeségek vannak benne, a jelszótárolásra még kitalálok vmit.:))
#!/bin/bash
#
#check_ubnt device
#

if [ $# -lt 1 ]; then
echo "Usage: ./check_ubnt_airmax_capacity devices"
exit 127
fi

HOST=$1
DATA="Airmax capacity:"
CRIT=30
WARN=50
STATUS=0

result=`sshpass -pjelszo ssh -o StrictHostKeyChecking=no root@$HOST cat /proc/sys/dev/ubnt_poll/capacity && exit`

if [ $RES != 0 ]; then
INK="Data Unknown - SNMP problem. No data received from host.";
echo $DATA;
STATUS=3;
exit $STATUS;
fi


#CHECK WARNING AND CRITICAL LEVELS
if (( $result < $CRIT )); then
echo "Airmax Capacity Critical - "$result"%";
STATUS=2
elif (( $result < $WARN )); then
echo "Airmax Capacity Warning - "$result"%";
STATUS=1
else
echo $DATA $result"%"
fi

exit $STATUS

A problémám, hogy nem zárja le az ssh kapcsolatot.
Próbáltma már minden félét.
EOF-al kiadni ssh-n a parancsokat de akkor még az eredmény változóban történő eltárolásával se boldogulok.
Megköszönnék egy kis segítséget tényleg nagyon béna vagyok bashben,
dkaro

(#28) Dadi207


Dadi207
csendes tag

Sziasztok,
segítségre lenne szükségem. :)
Készítettem egy scriptet, ami rendszeresen frissít néhány dolgot a telefonomon. A problémám az lenne, hogy ha így írom, akkor minden jól működik:
#!/sbin/sh

if [ -e $CMU/cm*NIGHTLY-bacon.zip ] || [ ! -e /data/system/packages.xml ]; then

Viszontha így, akkor nem:
#!/sbin/sh

CM=$(cd $CMU && ls cm*NIGHTLY-bacon.zip)

if [ -e $CMU/$CM ] || [ ! -e /data/system/packages.xml ]; then

Valaki tudna nekem segíteni, hogy miért nem működik a második?
Előre is köszönöm a válaszokat. :))

OnePlus One

(#29) Domonkos válasza dkaro (#27) üzenetére


Domonkos
Ármester

Nem nez ki olyan rosszul es hulyesegek sincsenek benne - bar nehol valoban lehetne egy kicsit egyszerubben kifejezni azt amit szeretnel.
En a helyedben a kulonbozo jelszavas trukkozesek helyett csinalnek egy ssh-keygen-es kulcspart a gepekhez, amivel a megfelelo jogosultsagok beallitasa utan jelszo nelkul at lehet jelentkezni egyikrol a masikra. Azutan egy sima result=$(ssh root@$HOST cat /proc/sys/dev/ubnt_poll/capacity)-val jonnie kellene a dolognak :K
Ha meg aktualis, akkor kerlek irj hogy mukodik-e! :)

Gender of electrical connectors is defined by the pins.

(#30) olivera88


olivera88
veterán

Látom elég kihalt a topic, de ezért hátha tud valaki segiteni.

Adott ez a letöltő script amit csináltam.

wget "https://opendata.dwd.de/weather/nwp/icon-eu/grib/06/tot_prec/icon-eu_europe_regular-lat-lon_single-level_$(date +"%Y%m%d")06_012_TOT_PREC.grib2.bz2" -O ICONPCP.grib2.bz2

A 012 itt változó szám, 000 tól indul és egyesével megy 118 ig. Az lenne kérdés h meglehetne úgy oldani h 001 kezdve pl 072 ig letöltse fájlokat?
Egyesével gondoltam letölteni, da úgy jó sokszor meg kelleni ismételni ezt a sort.

LG Velvet 5G Android 11 - Windows 10 Pro x64 & Debian 11 Bullseye - WoWS unsinkable_sam_

(#31) Domonkos válasza olivera88 (#30) üzenetére


Domonkos
Ármester

for i in 0{01..72} ; do echo alma${i}fa ; done

Ha ebben az echo-t lecsereled a wget-es cuccodra, akkor mukodni fog.

[ Szerkesztve ]

Gender of electrical connectors is defined by the pins.

(#32) olivera88 válasza Domonkos (#31) üzenetére


olivera88
veterán

for i in 0{01..72} ; do wget "https://opendata.dwd.de/weather/nwp/icon-eu/grib/12/tot_prec/icon-eu_europe_regular-lat-lon_single-level_$(date +"%Y%m%d")12_001_TOT_PREC.grib2.bz2" ; alma${i}fa ; done

Így? Nem megy így, csak egy fájlt tölt el ami meg van adva a linkben.

[ Szerkesztve ]

LG Velvet 5G Android 11 - Windows 10 Pro x64 & Debian 11 Bullseye - WoWS unsinkable_sam_

(#34) Keem1


Keem1
addikt

Srácok, segítséget kérnék.

Mutatom, hol tartok épp:
username="$(id -un)"
usergroup="$(id -gn)"
origuser="${SUDO_UID}"
origgroup="${SUDO_GID}"
echo "Current user: ${username}:${usergroup}"
echo "Original user: ${origuser}:${origgroup}"

Ha simán, userként hívom a scriptet, akkor tök jól megvan a user és a group is. Rootként szintén. De, szükségem lenne az eredeti userre is ez utóbbi esetben. A fenti félmegoldás szintén működik, azzal a szépséghibával, hogy a sudozó user uid és gid számait kapom. Ezek jók is, de nekem mindenképp nevesítve kellene a user és a group is.

Kettes számú feladat: ha a fenti megvan, akkor nem rootként a két-két user és group megegyezzen, ne legyen üres.

Van erre ötletetek? :R

(#35) cigam


cigam
félisten

Van egy egyszerűnek tűnő projekt, ami már a bash scriptnél elakad:
Az output-ba összegyűjti a tartalomjegyzéket, és az aktuális klipp adatait.
# Összegyűjti azokat az időpontokat, hol kezdődnek a klippek, szóközzel elválasztva
lines=$(echo "$output" |grep .mov |cut -d' ' -f3)
# Kiolvassa az aktuális klip sorszámát
clip_id=$(echo "$output"|grep 'clip id'|cut -d' ' -f3)
# Kiolvassa hol tart a lejátszás
current_time=$(echo "$output" |grep 'display timecode:' |cut -d' ' -f3|cut -d';' -f1)
# Ez elméletileg a klip kezdési időpontját adja meg
total_time=$(echo "$lines" | sed -n "${clip_id}p" |cut -d';' -f1)

Ez utóbbival van problémám, mivel nem kap értéket a total_time. Per pillanat ötletem sincs, hogy miért. A sed {} paraméteréről nem sokat találtam. Van valami ötlet pontosan mit csinál ez és miért nem adja vissza az időt?

Saját kútfőből próbáltam máshogy elérni a célt és eddig jutottam:
total_time=$(echo $lines | cut -d' ' -f 39)
Ez visszaadja a 39. track kezdés időpntját, de itt is elakadtam.
A total_time=$(echo $lines | cut -d' ' -f $clip_id)nem hozott jó eredményt valami \r-re panaszkodik.
Konkrét szám helyett hogy helyettesítsem a $clip_id-vel?
Az
echo "lines: " $lines
echo "clip id: $clip_id"
echo "current_time: $current_time"
echo "total time: $total_time"
Kimenete
lines:  00:00:00:00 00:02:48:00 00:03:28:16 00:06:08:20 00:09:42:24 00:11:48:09 00:16:04:14 00:18:57:15 00:22:25:13 00:23:08:16 00:23:51:14 00:24:13:12 00:27:16:00 00:30:37:00 00:34:51:13 00:37:14:16 00:39:50:09 00:43:54:11 00:47:19:14 00:48:03:02 00:48:37:01 00:52:35:23 00:55:44:00 00:57:37:07 01:00:30:10 01:03:29:00 01:07:13:03 01:10:47:06 01:14:17:01 01:16:30:19 01:20:26:13 01:22:44:19 01:26:49:20 01:29:26:24 01:32:20:12 01:33:56:08 01:34:34:09 01:38:39:15 01:38:47:12 01:56:52:15 01:56:54:12 02:13:08:22 02:13:44:17 02:15:51:10 02:18:30:10 02:20:35:10 02:22:29:00 02:24:52:01 02:28:14:06 02:31:09:16 02:34:12:04 02:37:51:09 02:39:55:15 02:40:05:14 02:40:35:14 02:41:05:14 02:42:25:14 02:43:12:08 02:49:22:16 02:52:07:03 02:53:59:17 02:55:01:04 02:57:02:12 02:57:54:19
clip id: 39
current_time: 01:45:09:07
total time: 01:38:47:12

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

(#36) Domonkos válasza cigam (#35) üzenetére


Domonkos
Ármester

Hmmm... Ez inkabb ugy hangzik, mintha a clip_id-val lenne a gond. Mintha ott ragadna egy CR a telnet kommunikaciobol a vegen.
Ha biztos vagy benne, hogy a clip_id az csak decimalis szam lehet, akkor a cut utan meg eggyel tovabb szurheted egy tr -cd 0-9-cel.

De amugy mar a bemenetet (itt epp output) lenne inkabb erdemes szurni: tr -d '\r' - es akkor tuti nem lesz a tobbi valtozoval sem ilyen gond.

Amugy a {} "parameter" az nem sed specifikus. Itt konkretan az a program ebbol semmit nem fog latni, mert az mar a hivas elott a clip_id-val (es a $-ral) egyutt behelyettesitodik a clip_id ertekere. Ami hogyha egy CR-t is tartalmaz, valoszinuleg nem lesz ervenyes sed parancs...

Tovabba valoszinuleg a telnet klienst/szervert is be lehetne ugy konfiguralni, hogy ne akarjanak CR-t kuldeni; de emlekeim szerint csak azzal szabvanyos a kommunikacio. Szoval a fenti hack egy kicsit meg altalanosabb megoldas is. :U

[ Szerkesztve ]

Gender of electrical connectors is defined by the pins.

(#37) Domonkos válasza Keem1 (#34) üzenetére


Domonkos
Ármester

Bar nem neztem utana, hogy pontosan miota, de az id az fogoad uid/gid parametereket is, szoval egy kelloen recens verzioval ennek mukodnie kellene:

username="$(id -un)"
usergroup="$(id -gn)"
origuser="`id -nu ${SUDO_UID}`"
origgroup="`id -ng ${SUDO_GID}`"
echo "Current user: ${username}:${usergroup}"
echo "Original user: ${origuser}:${origgroup}"

Ez veletlenul teljesiti a masodik feladatot is, mert nem sudo-s shell-ben az a ket valtozo valoszinuleg ures sztringekkent helyettesitodnek be.
De ha tutira akarsz menni, akkor hasznalhatod a futyi operatort (:-) a behelyettesiteskor. :K

[ Szerkesztve ]

Gender of electrical connectors is defined by the pins.

(#38) cigam válasza Domonkos (#36) üzenetére


cigam
félisten

Köszönö a sok infót, ötletet!

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Bash script
Copyright © 2000-2024 PROHARDVER Informatikai Kft.