GNU/Linux >> Znalost Linux >  >> Linux

$var vs ${var} A citovat, nebo necitovat?

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é.


Linux
  1. 7 Linux Grep OR, Grep AND, Grep NOT Příklady operátorů

  2. tmux:zamrzne a nenačte se a nereaguje na žádný příkaz volby

  3. Autoconf kontroluje program a selže, pokud není nalezen

  1. Linux – proč používáme Su – a nejen Su?

  2. Kopírování a vkládání nefunguje pod rdesktop

  3. readlink -fa -e popis volby není jasný

  1. „nohup Sudo…“ Nežádá o Passwd a nedělá nic?

  2. Je balíček, který jsem právě nainstaloval, legitimní, a pokud ne, jak jej odinstalovat?

  3. Proč je to Rm -rf a ne Rmdir -rf?