Umím psát
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
konečný výsledek se mi zdá být stejný. Proč bych měl psát jedno nebo druhé? nejsou některé z nich přenosné/POSIX?
Přijatá odpověď:
VAR=$VAR1
je zjednodušená verze VAR=${VAR1}
. Jsou věci, které druhý umí, které první nedokáže, například odkazovat na index pole (nepřenosné) nebo odstranit podřetězec (přenosný POSIX). Viz část Více o proměnných v Bash Guide for Beginners and Parameter Expansion ve specifikaci POSIX.
Použití uvozovek kolem proměnné jako v rm -- "$VAR1"
nebo rm -- "${VAR}"
je dobrý nápad. Tím se z obsahu proměnné stane atomová jednotka. Pokud hodnota proměnné obsahuje mezery (tedy znaky v $IFS
speciální proměnná, ve výchozím nastavení mezery) nebo globbingové znaky a neuvedete je v uvozovkách, pak se každé slovo považuje za generování názvu souboru (globbing), jehož expanze vytváří tolik argumentů, co děláte.
$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'
$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename
O přenositelnosti:
Podle POSIX.1-2008 sekce 2.6.2 jsou složené závorky volitelné.