Portál AbcLinuxu, 30. listopadu 2025 20:48
for i in $*; do echo "$i" doneA zavolám ho:
$ myscript meow meow2 "meow with space" meow meow2 meow with spaceStejně je to když použiju
$@ místo $*. Když to ale dám do uvozovek jako "$*" a "$@", tak dostávám:
# for i in "$*"; do echo "$i"; done meow meow2 meow with space # for i in "$@"; do echo "$i"; done meow meow2 meow with spacePoslední příklad mi tedy dává, co potřebuju, v případě argumentů předaných skriptu. Co teď ale potřebuju je něco podobného s proměnnou místo argumentů. Následující nefunguje
myvar="meow meow2 \"meow with space\""
# for i in ${myvar}; do echo "$i"; done
meow
meow2
"meow
with
space"
# for i in "${myvar}"; do echo "$i"; done
meow meow2 "meow with space"
Co potřebuju je výstup
meow meow2 meow with space
# embeded newline
myvar="meow
meow2
meow with space"
SAVEIFS="${IFS}"
# split on newline
IFS=$'\n'
a=1
for i in ${myvar}; do
echo "arg${a}: ${i}"
a=$((a+1))
done
IFS="${SAVEIFS}"
Tedy mám "jakési" pole, kde jsou položky rozděleni znakem nového řádku. Problém je, že znak nového řádku se může vyskytovat třeba ve jménu souboru (asi zřídka, ale může), takže by to chtělo jiný oddělovač. Bohužel nula (tj. jediný znak, který není v cestě souboru) jaksi v sh nefunguje
$'\n' je bashismus. V busyboxím ash mi to funguje, ale chtěl bych to mít portabilní (česky?). Zkusil jsem tedy jejich IFS="$(printf '\n')", jenže to mi novou řádku ukradne a do proměnné neuloží, ačkoliv samotný printf '\n' ji produkuje.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.