Portál AbcLinuxu, 4. května 2025 17:07
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.