- Apple Watch
- Mi nincs, grafén akku van: itt a Xiaomi 11T és 11T Pro
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Telekom mobilszolgáltatások
- iPhone topik
- Yettel topik
- 6 év biztonsági támogatást ígér a Motorola
- Ilyen lesz a Fairphone 6
- Íme az új Android Auto!
- Honor Magic6 Pro - kör közepén számok
Új hozzászólás Aktív témák
-
Jester01
veterán
-
-
Jester01
veterán
Nem kell az extra idézőjelezés (a \"). Az a lényeg, hogy az rsync egyben kapja meg de azon belül már nem kell idézőjel mert akkor az egészet programnévnek akarja értelmezni.
rsync -avh -e "${SSH_CMD} -p ${SCP_PORT} -i ${SCP_KEYFILE}" . "${SCP_USER}@${SCP_HOST}:${SCP_PATH}/${LVM_BACKUP_LOGICAL_VOLUME}-${DATE_TIME}/"
Illetve ha nagyon pedáns akarsz lenni és attól félsz, hogy itt-ott lehet szóköz akkor az egyes argumentumok köré tehetsz idézőjelet (persze akkor már azt is kezelni kellene, ha esetleg idézőjel van benne ... can of worms)
rsync -avh -e "\"${SSH_CMD}\" -p \"${SCP_PORT}\" -i \"${SCP_KEYFILE}\"" . "${SCP_USER}@${SCP_HOST}:${SCP_PATH}/${LVM_BACKUP_LOGICAL_VOLUME}-${DATE_TIME}/"
-
Jester01
veterán
Mivel while true van, ezért a script végén lévő 3 sor sosem fog lefutni. Javaslom tedd trap handlerbe.Ettől eltekintve a célnak megfelel.
Ha nagyon kötözködni akarnék, akkor:
1) az echo "" sorban felesleges a ""
2) The command substitution $(cat file) can be replaced by the equivalent but faster $(< file). (forrás: man bash)
3) az if-elif-elif helyett lehetne valami adatvezérelt megoldás. -
Jester01
veterán
Ha feltételezzük, hogy nincs túl sok fájl akkor ennyivel is meg lehet úszni az egészet:
awk '/Osszes tabla szama/ { sum = sum + $5 } END {print sum}' *.txt
-
-
Jester01
veterán
válasz
ngabor2 #1122 üzenetére
Imagemagick tudja, hogy aránytartóan átmeretez úgy, hogy 1024x1024-be beleférjen. Kb. annyi az egész, hogy:
find . -type f | while read file; do mkdir -p "../out/${file%/*}" && convert -verbose "$file" -resize '1024>x1024>' "../out/$file"; done
Abba a részfába írni amit a find éppen feldolgoz nem éppen életbiztosítás, ezért én itt inkább egy feljebb lévő out directoryba írok.
A file listára szétszedés innen már triviális (akkor persze már lehet ugyanoda pakolni a kimenetet). -
Jester01
veterán
Nem biztos, hogy jól értettem a feladatot mert kicsit zavaros a megfogalmazás, az első két sorra viszont jó
$ cat >script.sh
#! /bin/bash
count=`wc -l "$1"`
count=${count%% *}
slice=$((count / 6))
exec 3< "$1"
for ((i=0;i<3;i+=1))
do
for ((j=0;j<slice;j+=1))
do
read -r -u 3 line
buffer[j]=$line
done
for ((j=0;j<slice;j+=1))
do
read -r -u 3 line
echo ${buffer[j]} $line
done
done
$ chmod +x script.sh
$ seq 1 24 >in.txt
$ ./script.sh in.txt
1 5
2 6
3 7
4 8
9 13
10 14
11 15
12 16
17 21
18 22
19 23
20 24 -
Jester01
veterán
válasz
bambano #1093 üzenetére
A -eq az jogos, nem vettem észre.
A ; csak akkor kell, ha egy sorban van.
A hibaüzenet viszont attól van amit írtam. Amíg az rossz, addig a shell nem is lát neki futtatni. A -eq dolog már csak a test kapcsolója, az majd reklamál magának:
line 3: [: eq: binary operator expected
-
Jester01
veterán
Azzal nincs baj, az else blokk üres és azt nem szereti. Vagy töröld ki az else-t vagy írjál bele valamit.
MOD: amúgy az a wc ott nagyon csúnya ... a grep-nek is van visszatérési értéke. Szóval olyasmi lehetne, hogy
if dmidecode -t baseboard | grep 1ZGA097Y1BL >/dev/null
then
...
fi -
Jester01
veterán
Ezek a különböző módban töltött időadatok (user,system,nice, idle, wait, egyebek)
Százalékot úgy kapsz belőle mint ahogy a top is - két egymás utáni értéket kivonsz és osztod a teljes idővel.Mondjuk ha kifejezetten a monitorozás a cél, és nem pedig a script írás, akkor nyilván vannak erre kész megoldások.
-
Jester01
veterán
válasz
eriktoth #943 üzenetére
A ciklusban nem is használod a FILE változót. A for pedig nem ellenőrzi a fájlok létezését, ráadásul azokra a fájlokra nincs is hivatkozás.
Egyszerűbb lenne a konkrét fájlokat keresni, pl így:find . -name stdout-captured -o -name stderr-captured -o -name status-captured |
while read -r FILE
do
diff -up "$FILE" "${FILE%captured}expected" > "${FILE%captured}delta" 2>/dev/null
doneIgény szerint lehet vizsgálni, hogy az expected is létezzen.
-
Jester01
veterán
Van exit do, úgy hívják, hogy break. De az csak a ciklusmagban működik, trap-ból nem. Ha nem akarsz a trap-ban kilépni a scriptből, akkor ott beállíthatsz egy változót amit aztán a ciklus folyton ellenőriz.
MOD: mondjuk a sleep-pel nem tudom milyen interakció van, azt még meg kellene nézni.
-
-
Jester01
veterán
válasz
CPT.Pirk #876 üzenetére
dc és bc "számológép" programok.
Logaritmus bc-vel például:$ echo "l(2.71)" | bc -l
.99694863489160953206Olvasáshoz legegyszerűbb ha végtelen ciklusban simán pollozod a /dev/ttyUSB0-t és kész.
Lásd még #857, bár nekem parancsot kellett kiküldeni, illetve fix byteot olvasni.
-
Jester01
veterán
válasz
MacCaine #859 üzenetére
Először is kell egy táblázat, ami minden billentyűhöz megmondja a szomszédait. Aztán szépen rekurzívan bejárod adott hosszig, ügyelve, hogy ismétlődés ne legyen (már ha ez feltétel). Például valahogy így:
#! /bin/bash
len=3
declare -A layout
layout["a"]=qwsxz
layout["s"]=wedcxzaq
layout["d"]=erfvcxsw
layout["f"]=rtgbvcde
# ...
function process
{
local text="$1"
local options="$2"
local i
local letter
local newtext
local next
for ((i=0; i<${#options}; i+=1))
do
letter=${options:i:1}
if [ "${text/$letter/}" = "${text}" ]
then
newtext="${text}${letter}"
if [[ ${#newtext} == $len ]]
then
echo "$newtext"
else
next=${layout[$letter]}
if [[ ${#next} > 0 ]]
then
process "$newtext" "$next"
fi
fi
fi
done
}
for i in "${!layout[@]}"
do
process "" "$i"
done -
Jester01
veterán
válasz
CPT.Pirk #854 üzenetére
Ha nem csak lsusb-vel látszik, hanem ténylegesen soros portként is (pl. /dev/ttyUSB0), akkor igen egyszerűen el lehet ezt követni.
Syslog részlet:
kernel: usb 3-1: new full speed USB device number 29 using ohci_hcd
kernel: usb 3-1: New USB device found, idVendor=067b, idProduct=2303
kernel: usb 3-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
kernel: usbcore: registered new interface driver usbserial
kernel: USB Serial support registered for generic
kernel: usbcore: registered new interface driver usbserial_generic
kernel: usbserial: USB Serial Driver core
kernel: USB Serial support registered for pl2303
kernel: pl2303 3-1:1.0: pl2303 converter detected
kernel: usb 3-1: pl2303 converter now attached to ttyUSB0
kernel: usbcore: registered new interface driver pl2303
kernel: pl2303: Prolific PL2303 USB to serial adaptor driverNekem például hőmérők vannak így bekötve, az értékeket pedig egy ilyen script rész logolta:
while true
do
echo -ne "#03\r" >/dev/ttyUSB0
v=`dd if=/dev/ttyUSB0 bs=42 count=1 2>/dev/null`
d=`date --rfc-3339=seconds -u`
echo "${d:0:16}${v//+/;}" >>temp.txt
sleep 60
done -
Jester01
veterán
válasz
Iginotus #779 üzenetére
#! /bin/bash
function do_field
{
tmp=${1//\"/}
tmp=${tmp//Ü/Ue}
tmp=${tmp//ä/ae}
tmp=${tmp/ /# }
echo $tmp
}
IFS=$'\t'
while read a b
do
a=$(do_field "$a")
b=$(do_field "$b")
echo "$a,$b, , , , ,"
doneMOD: ez egy "szűrő" vagyis standard inputról olvas, outputra ír. Tehát valahogy imígyen kell használni:
./script.sh <in.txt
Wietmarschen,Lotte, , , , ,
Bissendorf,Gohfeld# (Uebergang A 30/B 61), , , , , -
Jester01
veterán
válasz
bluetiger9 #667 üzenetére
Szerintem idézőjel hiányzik a $c köré.
-
Jester01
veterán
válasz
szunyog199 #661 üzenetére
Hát mert a case az nem úgy működik. Oda csak mintát lehet megadni. Használj további if-else szerkezetet. Mellesleg a lezáró esac is hiányzik.
-
Jester01
veterán
válasz
Nyiscsák #657 üzenetére
root@rpg-desktop:~/Asztal# ./rar.sh /home/rpg/ /home/rpg/Asztal/
tar: A kezdő „/” eltávolítása a nevek elejérőlItt ha egyéb üzenet nem volt, akkor ez sikeres volt. Az nem hiba, csak a tar szólt, hogy lecsapja a kezdő / karaktert, hogy ne abszolút elérési út legyen (ez kicsomagolásnál jól jön) A tgz fájl minden bizonnyal létrejött.
-
Jester01
veterán
válasz
Nyiscsák #651 üzenetére
Először is a -Z az nem gzip, mert az a kis z. Másodszor, az argumentumokat pont fordítva adtad meg. Harmadszor, ha legközelebb kérdezel legalább a hibaüzenetet légyszíves.
#!/bin/sh
mit="/home/nyiscsak/Asztal/"
hova="/var/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -czf "$hova$OF" "$mit"MOD: ja ha bemenő paraméterben akarod megadni, akkor értelemszerűen "$1" és "$2"
-
Jester01
veterán
man awk:
-W re-interval
--re-interval
Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).
Interval expressions were not traditionally available in the AWK language. The POSIX standard added them, to
make awk and egrep consistent with each other. However, their use is likely to break old AWK programs, so
gawk only provides them if they are requested with this option, or when --posix is specified.Ha ez nem tetszik akkor helyettesítsd a [a-z]{2,3} részt ezzel: [a-z][a-z][a-z]?
MOD: ja amúgy a domain nem csak 2 vagy 3 betű lehet, illetve egy ideje már nem is csak a-z
-
Jester01
veterán
MOD: hm, számít, hogy könyvár
Arról nekem se szedi le.
man chmod:
chmod preserves a directory's set-user-ID and set-group-ID bits unless you explicitly specify otherwise. You can set or clear the bits with symbolic modes like u+s and g-s, and you can set (but not clear) the bits with a numeric mode. -
Jester01
veterán
válasz
HUNNIA1920 #574 üzenetére
1) a megoldás során végig az eredeti directoryban állsz (ami a B szülője). Ezért például az E/C forma nem jó, hiszen az E a B-ben van. Tehát B/E/C formában kell rá hivatkozni. Hasonlóan a többire is.
2) az echo az nem üres fájlt hoz létre, beleír egy entert. Ha ez probléma, akkor echo -n vagy egyszerűen touch.
3) a chmod nem csak az oktális jogokat szereti, ismeri a szimbolikust is
4) az mkdir-nek egyből meg is lehet adni jogokat
Pl. mkdir -m u=rwx,g=rxs,o=rx B -
Jester01
veterán
Ha már ennyire rámentél a külső parancsok eliminálására (nagyon helyesen) akkor azért azt se felejtsd el, hogy a bash kiválóan szét tudja szabdalni a stringet, nem kell hozzá a sed. Az adott példában ha jól látom egyszerűen ident=${i//_*html/} avagy a string végét feltételezve ident=${i%%_*html}.
-
Jester01
veterán
Csak hibás kötekedés, mivel a hard linkek nem egymásra mutatnak, hanem az inode-ra. Persze "pucér" inode-t nem tudsz létrehozni, rögtön kapsz hozzá 1 hard linket induláskor. De a végén C és D tökéletesen egyenértékű, nem tudod megmondani melyik az "igazi". Nem úgy, mint symlink esetén.
-
-
Jester01
veterán
A listexecutables dologra az én megoldásom kb így nézne ki:
Először egy ciklus a PATH-ban lévő directorykra, azon belül az összes fájlra.
Fájlonként ellenőrizni, hogy az alábbiak valamelyike teljesül-e:
- tulajdonos egyezik-e a felhasználóval, és van-e futtatási joga.
- csoport futtatási jog van, és a felhasználó benne van a csoportban (/etc/group alapján)
- mindenkinek van rá futtatási jogaBekavarhat, ha a PATH-ban relatív útvonal is van (tipikusan a "."). Ez ellen még azt lehet tenni, hogy egy tömbben eltárolni az összes fájlt (miután abszolúttá alakítottad) és az alapján kihagyni a duplákat. Alternatívaként bele lehet tölteni egy sort | uniq csőbe is.
Az awk script ehhez képest egyszerű. Kell egy tömb ahol felhasználónként összesíted az időket, illetve egy másik, ahol a legutoljára látott bejelentkezési időpontokat tárolod. A sorokon mész szépen végig. Ha login sor jön, akkor azt beírod a bejelentkezős tömbbe. Ha logout sor jön, akkor kiveszed a hozzá tartozó bejelentkezési időt a tömbből és a kiszámított eltelt időt pedig hozzáadod az összesítéshez. A napló végén pedig kiírod az összesített táblázatot.
-
Jester01
veterán
válasz
VladimirR #378 üzenetére
Igen, pontosan. 3 operátor van ebben a családban, 2 verzióban: # és ##, % és %% valamint / és //. A # illetve a % a szöveg elejéről illetve a végéről törli ki a mintának megfelelő legrövidebb részt, a duplázott verzió a leghosszabbat. A / pedig cseréli az első, míg a // az összes előfordulást:
$ t=abrakadabra
$ echo ${t#*b}
rakadabra
$ echo ${t##*b}
ra
$ echo ${t%b*}
abrakada
$ echo ${t%%b*}
a
$ echo ${t/ra/X}
abXkadabra
$ echo ${t//ra/X}
abXkadabXbambano: a case-ben vigyázni kell, ott else is van
Amúgy ezekről lehet tudni, hogy miért javasoltak? Olvashatóságot szerintem rontják, hatékonyságban pedig nem hiszem, hogy bármi különbség lenne.
-
Jester01
veterán
válasz
icespeak #371 üzenetére
Mármint parancssori kapcsolókat?
Legegyszerűbb esetben a kapcsolókat az esetleges fájlnév argumentumok elé teszed, és akkor egy ciklusban mehetsz egy case blokkban a $1-et nézve. Érvényes kapcsoló esetén beállítod a megfelelő változót (ami alapján később mást csinál a progi) és egy shift paranccsal lépsz a következőre. Példa:
while true
do
case "x$1" in
x-h) echo "help"; exit 0;;
x-q) Q=1; shift;;
x-*) echo "ismeretlen kapcsolo"; exit 1;;
*) break;;
esac
doneSorok szétválogatására egyszerűen ciklusban olvasol mindig 2 sort, amiket szétdobálsz.
while true
do
read paratlan
echo "$paratlan" >> paratlan.txt
read paros
echo "$paros" >> paros.txt
done < bemenet.txtMég tegyél bele fájlvég ellenőrzést és kész is.
MOD: persze olvashatod egyesével is, de akkor kelleni fog egy változó ami mutatja éppen a páros vagy a páratlan sor következik és az alapján eldönteni melyik fájlba kell írni. -
Jester01
veterán
A sed egyáltalán nem törődik a shell változókkal. Alapesetben kap egy ''programot'' és az stdin-ről (vagy fájlokból) olvasva az stdout-ra ír. A változóhivatkozásokat még a shell feloldja mielőtt a sed megkapná.
Egy apró érdekes illusztráció ebben a témakörben az ''echo *'' parancs. Természetesen nem az echo tanult meg fájlokat listázni. -
Jester01
veterán
Ezt szerintem két apró módosítással lehet a legegyszerűbben.
Először is, az ''ok'' és ''nemok'' helyett inkább egy ''statusz'' változót alkalmaznék.
Másodszor, ha jól értem az index.php-t módosítani akarod. Ehelyett én csinálnék egy minta fájlt, és abból gyártanám az index.php-t. Legyen ez a fájl index.php.in, ennek a második sorát fogjuk lecserélni, oda írhatsz is valami erre utaló megjegyzést.
A kód pedig ezekután igen egyszerűen így nézhet ki:
sed ''2c\\$statusz'' </var/www/php/index.php.in >/var/www/php/index.php
Új hozzászólás Aktív témák
Hirdetés
- Assassin's Creed Shadows Collector's Edition PC
- Bontatlan - BATTLEFIELD 1 Collectors Edition - Játékszoftver nélkül
- Kaspersky, McAfee, Norton, Avast és egyéb vírusírtó licencek a legolcsóbban, egyenesen a gyártóktól!
- Eredeti Microsoft termékek - MEGA Akciók! Windows, Office Pro Plus, Project Pro, Visio Pro stb.
- Gyermek PC játékok
- Bomba ár! HP EliteBook 830 G5 - i5-8G I 8GB I 256GB SSD I 13,3" FHD I HDMI I Cam I W11 I Gari!
- Készpénzes számítógép PC félkonfig alkatrész hardver felvásárlás személyesen / postával korrekt áron
- AKCIÓ! ASUS B650M R5 7600X 64GB DDR5 1TB SSD RTX 3080Ti 12GB Be Quiet! Pure Base 500FX ASUS 1000W
- Azonnali készpénzes nVidia RTX 3000 sorozat videokártya felvásárlás személyesen / csomagküldéssel
- Telefon felvásárlás!! Samsung Galaxy S24/Samsung Galaxy S24+/Samsung Galaxy S24 Ultra
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest