it-swarm-ko.tech

$ VAR vs $ {VAR} 및 견적 또는 견적

난 쓸수있다

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"

나에게 최종 결과는 거의 같습니다. 왜 하나를 작성해야합니까? 휴대용/POSIX가 아닌 것은 무엇입니까?

150
xenoterracide

VAR=$VAR1VAR=${VAR1}의 단순화 된 버전입니다. 예를 들어 배열 인덱스 (휴대용 아님)를 참조하거나 하위 문자열 (POSIX- 포터블)을 제거 할 수없는 경우도 있습니다. 초보자를위한 Bash 안내서의 변수에 대한 추가 정보 섹션 및 POSIX 사양의 매개 변수 확장 을 참조하십시오.

rm -- "$VAR1" 또는 rm -- "${VAR}"와 같이 변수에 따옴표를 사용하는 것이 좋습니다. 변수의 내용을 원자 단위로 만듭니다. 변수 값에 공백 (공백 $IFS 특수 변수의 문자, 기본적으로 공백)이 포함되어 있고 따옴표를 사용하지 않는 경우 각 단어는 파일 이름 생성 (글 로빙)으로 간주되어 확장됩니다. 당신이하고있는 일에 대한 많은 논쟁.

$ 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

이식성 : POSIX.1-2008 섹션 2.6.2 에 따르면 중괄호는 선택 사항입니다.

108
Shawn J. Goff

${VAR}$VAR는 정확히 같습니다. 일반 변수 확장의 경우 ${VAR}를 사용하는 유일한 이유는 ${VAR1}_$VAR2에서와 같이 구문 분석시 너무 많은 문자를 변수 이름으로 가져 오는 경우입니다 (중괄호가없는 경우 ${VAR1_}$VAR2). 대부분의 장식 확장 (${VAR:=default}, ${VAR#prefix},…)에는 중괄호가 필요합니다.

변수 할당에서 필드 분할 (즉, 값에서 공백으로 분할) 및 경로 확장 (즉, 글 로빙)이 해제되어 있으므로 VAR=$VAR1는 정확히 내가 들었던 모든 POSIX 쉘과 모든 POSIX 이전의 쉘에서 VAR="$VAR1"와 같습니다. (POSIX 참조 : 간단한 명령 ). 같은 이유로 VAR=*VAR를 리터럴 문자열 *로 안정적으로 설정합니다. 물론 VAR=a bVAR이 처음에 별도의 단어이므로 ab로 설정합니다. 일반적으로 셸 구문에서 단일 단어를 기대하는 경우 큰 따옴표는 필요하지 않습니다 (예 : in case … in (패턴은 아님). 예 POSIX는 redirection targets (>$filename)가 스크립트에서 인용을 요구하지 않지만 bash를 포함한 몇몇 쉘은 스크립트에서도 큰 따옴표를 요구하도록 지정합니다. 보다 철저한 분석은 더블 쿼터가 필요한시기? 를 참조하십시오.

다른 경우, 특히 많은 쉘에서 export VAR="${VAR1}" (export "VAR=${VAR1}"와 같이 쓸 수 있음)에서 큰 따옴표가 필요합니다 (POSIX는이 경우를 열어 둡니다). 간단한 할당 으로이 사례의 유사성과 큰 따옴표가 필요하지 않은 사례 목록의 흩어져있는 특성 때문에 분할하고 움켜 쥐고 싶지 않으면 큰 따옴표를 사용하는 것이 좋습니다.

인용

큰 따옴표는 변수 확장에 사용되고 작은 따옴표는 큰 따옴표, 즉 sans 확장에 사용됩니다.

확장:

this='foo'
that='bar'
these="$this"
those='$that'

산출:

for item in "$this" "$that" "$these" "$those"; do echo "$item"; done
foo
bar
foo
$that

몇 가지 이유로 가능한 경우 인용문을 사용해야한다는 점을 언급하는 것이 좋습니다. 그 중 가장 좋은 방법은 모범 사례로 간주되고 가독성이 뛰어납니다. 또한 Bash는 때로는 기발하고 때로는 비논리적이거나 비합리적이거나 예기치 않은 방식으로 보이기 때문에 인용은 암시 적 기대치를 명시 적으로 변경하여 오류 표면 (또는 잠재적 가능성)을 줄입니다.

not 인용하는 것은 합법적이며 대부분의 경우 작동하지만 편의상 제공되는 기능으로 이식성이 떨어집니다. 의도와 기대를 반영하는 완전한 형식의 관행은 인용하는 것입니다.

치환

이제 구문 "${somevar}"가 대체 연산에 사용된다는 것도 고려하십시오. 교체 및 어레이와 같은 여러 사용 사례.

교체 (스트리핑) :

thisfile='foobar.txt.bak'
foo="${thisfile%.*}"   # removes shortest part of value in $thisfile matching after '%' from righthand side
bar="${thisfile%%.*}"  # removes longest matching

for item in "$foo" "$bar"; do echo "$item"; done
foobar.txt
foobar

교체 (교체) :

foobar='Simplest, least effective, least powerful'
# ${var/find/replace_with}
foo="${foobar/least/most}"   #single occurrence
bar="${foobar//least/most}"  #global occurrence (all)

for item in "$foobar" "$foo" "$bar"; do echo "$item"; done
Simplest, least effective, least powerful
Simplest, most effective, least powerful
Simplest, most effective, most powerful

배열 :

mkdir temp
# create files foo.txt, bar.txt, foobar.txt in temp folder
touch temp/{foo,bar,foobar}.txt
# alpha is array of output from ls  
alpha=($(ls temp/*))

echo "$alpha"         #  temp/foo.txt
echo "${alpha}"       #  temp/foo.txt
echo "${alpha[@]}"    #  temp/bar.txt  temp/foobar.txt  temp/foo.txt
echo "${#alpha}"      #  12 # length of first element (implicit index [0])
echo "${#alpha[@]}"   #  3  # number of elements
echo "${alpha[1]}"    #  temp/foobar.txt # second element
echo "${#alpha[1])"   #  15 # length of second element

for item in "${alpha[@]}"; do echo "$item"; done
temp/bar.txt
temp/foobar.txt
temp/foo.txt

이 모든 것이 "${var}" 대체 구문의 표면을 간신히 긁고 있습니다. Bash Shell 스크립팅에 대한 확실한 참조는 libre 온라인 참조, TLDP The Linux Documentation Project https://www.tldp.org/LDP/abs/html/parameter-substitution.html입니다.

9
SYANiDE
ls -la

lrwxrwxrwx.  1 root root      31 Nov 17 13:13 prodhostname
lrwxrwxrwx.  1 root root      33 Nov 17 13:13 testhostname
lrwxrwxrwx.  1 root root      32 Nov 17 13:13 justname

그런 다음 종료하십시오.

env=$1
    if [ ! -f /dirname/${env}hostname ]

curlies를 사용하는 명확한 예로 언급 할 가치가 있습니다.

0
ninjabber