난 쓸수있다
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
나에게 최종 결과는 거의 같은 것 같습니다. 왜 이런 것 중 하나를 써야 합니까? 이식 가능/POSIX가 아닌 것이 있습니까?
답변1
VAR=$VAR1
예, 단순화된 버전입니다 VAR=${VAR1}
. 두 번째는 할 수 있지만 첫 번째는 할 수 없는 일이 있습니다. 예를 들어 배열 인덱스 참조(이식 가능 아님) 또는 하위 문자열 제거(POSIX - 이식 가능) 등이 있습니다. 보다변수에 대한 추가 정보Bash 초보자 가이드의 일부매개변수 확장POSIX 사양에서.
변수 주위에 따옴표를 사용하는 것이 좋습니다 (예: rm -- "$VAR1"
or의 따옴표) . 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, 중괄호는 선택 사항입니다.
답변2
${VAR}
완전히 동일 합니다 $VAR
. 일반적인 변수 확장의 경우 ${VAR}
구문 분석을 통해 변수 이름에 다음과 같은 문자가 너무 많이 포함되는 경우 ${VAR1}_$VAR2
(중괄호 없이 ${VAR1_}$VAR2
) 를 사용해야 하는 유일한 이유 입니다. 대부분의 장식 확장( ${VAR:=default}
, ${VAR#prefix}
, ...)에는 중괄호가 필요합니다.
csh, tcsh 또는 zsh( ksharrays
옵션이 활성화되지 않은 경우) 에서는 and $var[1]
와 동일 하므로 리터럴 뒤에 : 또는 : 을 확장하려면 중괄호도 필요합니다.${var[1]}
$var:modifier
${var:modifier}
$var
[1]
:modifier
${var}[1]
${var}:modifier
스칼라(배열 또는 연관 배열과 반대) 변수 할당에서는필드 분할(즉, 값의 공백으로 분할)경로명 확장(즉, globbing)은 꺼져 있으므로 내가 들어본 모든 POSIX 셸과 모든 POSIX 이전 shs에서 VAR=$VAR1
와 정확히 동일합니다 . VAR="$VAR1"
(POSIX 참조:간단한 명령). 물론 같은 이유로 리터럴 문자열로 VAR=*
설정됩니다 . 왜냐하면 the는 처음에 단일 단어이기 때문입니다. 일반적으로 쉘 구문에 단일 단어가 필요한 경우 큰따옴표는 필요하지 않습니다.VAR
*
VAR=a b
VAR
a
b
존재하다case … in
(그러나 스키마에는 없음) 거기에서도 주의가 필요합니다. 예: POSIX는 다음과 같이 지정합니다.리디렉션 대상( >$filename
)는 스크립트에서 따옴표를 요구하지 않지만 일부 쉘(bash 포함)은 스크립트에서도 큰 따옴표를 요구합니다. 바라보다언제 큰따옴표가 필요합니까?좀 더 철저한 분석을 위해.
export VAR="${VAR1}"
특히 동등하게 작성할 수 있는 많은 쉘에서 큰따옴표가 필요한 다른 경우가 있습니다 export "VAR=${VAR1}"
(POSIX에서는 이 경우를 예약합니다). 이 사례는 간단한 할당과 유사하고 큰 따옴표가 필요하지 않은 사례 목록의 분산된 특성으로 인해 분할 및 와일드카드를 정말로 원하지 않는 한 큰 따옴표를 사용하는 것이 좋습니다.
답변3
인용하다
변수 확장에는 큰 따옴표를, 확장이 없는 큰 따옴표에는 작은 따옴표를 고려하세요.
확장:
this='foo'
that='bar'
these="$this"
those='$that'
산출:
for item in "$this" "$that" "$these" "$those"; do echo "$item"; done
foo
bar
foo
$that
여러 가지 이유로 가능할 때마다 인용을 사용해야 한다는 점을 언급할 가치가 있을 것입니다. 그 중 가장 좋은 점은 그것이 모범 사례로 간주되고 가독성이 높다는 것입니다. 또한 Bash는 때때로 비논리적이거나 비합리적/예상치 못한 것처럼 보이는 방식으로 변덕스러울 수 있기 때문에 인용하면 암시적 기대가 명시적 기대로 변경되어 오류 표면(또는 그에 따른 오류 가능성)이 줄어듭니다.
이것은 완전히 합법적이지만아니요인용해 보세요. 대부분의 경우 작동하지만 이 기능은 편의를 위해 제공되는 것이므로 이식성이 좋지 않을 수 있습니다. 의도와 기대를 반영하는 것이 보장되는 완전히 공식적인 접근 방식은 인용입니다.
치환
"${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 쉘 스크립팅에 대한 권위 있는 참조는 libre 온라인 참조인 TLDP Linux 문서 프로젝트입니다.https://www.tldp.org/LDP/abs/html/parameter-substitution.html