우리는 언제 조개 변수 주변에 곱슬곱슬한 중괄호가 필요합니까?
셸 스크립트에서 다음을 사용하는 경우{}
변수를 확장할 때?
예를 들어, 다음을 보았습니다.
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
큰 차이가 있나요, 아니면 그냥 스타일인가요?어느 쪽이 다른 쪽보다 선호됩니까?
이 특정 예제에서는 아무런 차이가 없습니다.하지만, 그{}
에${}
변수를 확장하려는 경우 유용합니다.foo
현 상태에서
"${foo}bar"
부터"$foobar"
대신 에 의해 식별된 변수를 확장합니다.foobar
.
또한 다음과 같은 경우에는 반드시 곱슬곱슬한 중괄호가 필요합니다.
- 배열 요소 확장,에서와 같이
${array[42]}
- 매개 변수 확장 작업 사용(예:
${filename%.*}
(확장자 제거) - 위치 매개 변수를 9 이상 확장:
"$8 $9 ${10} ${11}"
잠재적으로 모호한 경우에만 이 작업을 수행하는 대신 모든 곳에서 이 작업을 수행하는 것이 좋은 프로그래밍 관행으로 간주될 수 있습니다.이는 일관성과 다음과 같은 예상치 못한 상황을 방지하기 위한 것입니다.$foo_$bar.jpg
밑줄이 변수 이름의 일부가 되는 것이 시각적으로 분명하지 않은 경우.
변수는 다음 값 없이 선언되고 할당됩니다.$
그리고 없이{}
사용해야 합니다.
var=10
할당합니다.변수를 읽으려면(즉, 변수를 '확장') 다음을 사용해야 합니다.$
.
$var # use the variable
${var} # same as above
${var}bar # expand var, and append "bar" too
$varbar # same as ${varbar}, i.e expand a variable called varbar, if it exists.
이것은 때때로 저를 혼란스럽게 했습니다 - 다른 언어에서 우리는 변수가 과제의 왼쪽에 있든 오른쪽에 있든 상관없이 동일한 방식으로 변수를 참조합니다.하지만 셸 스크립팅은 다릅니다.$var=10
당신이 생각하는 것을 하지 않습니다!
사용자{}
그룹화를 위한배열 요소의 참조를 취소하려면 가새가 필요합니다.예:
dir=(*) # store the contents of the directory into an array
echo "${dir[0]}" # get the first entry.
echo "$dir[0]" # incorrect
교정기 내부에서 일부 텍스트 조작을 수행할 수도 있습니다.
STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}
결과:
./folder/subfolder/file.txt ./folder
또는
STRING="This is a string"
echo ${STRING// /_}
결과:
This_is_a_string
당신 말이 맞아요 "정규 변수"는 필요 없어요...하지만 디버깅과 스크립트를 읽는 것이 더 도움이 됩니다.
어레이 요소에 액세스하고 브레이스 확장을 수행하려면 항상 컬리 브레이스가 필요합니다.
너무 조심하지 말고 사용하는 것이 좋습니다.{}
모호성의 범위가 없는 경우에도 셸 변수 확장의 경우.
예:
dir=log
prog=foo
path=/var/${dir}/${prog} # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log # same as above, . can't be a part of a shell variable name
path_copy=${path} # {} is totally unnecessary
archive=${logfile}_arch # {} is needed since _ can be a part of shell variable name
따라서 세 줄을 다음과 같이 쓰는 것이 좋습니다.
path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path
확실히 더 읽기 쉬운 방법입니다.
변수 이름은 숫자로 시작할 수 없으므로 셸이 필요하지 않습니다.{}
번호가 매겨진 변수 주위(예:$1
,$2
숫자 뒤에 해당 확장이 나타나지 않는 경우 등).그건 너무 미묘하고 명백하게 사용합니다.{}
다음과 같은 맥락에서:
set app # set $1 to app
fruit=$1le # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear
참조:
변수 이름의 끝은 일반적으로 공백이나 새 줄로 표시됩니다.하지만 변수 값을 인쇄한 후 공백이나 줄바꿈을 원하지 않으면 어떻게 해야 합니까?곱슬곱슬한 대괄호는 셸 인터프리터에게 변수 이름의 끝이 어디에 있는지 알려줍니다.
고전적 예제 1) - 후행 공백이 없는 셸 변수
TIME=10
# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"
# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"
예 2) 버전이 있는 jars가 있는 Java 클래스 경로
# WRONG - no such variable LATESTVERSION_src
CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar
# RIGHT
CLASSPATH=hibernate-${LATESTVERSION}_src.zip:hibernate_$LATEST_VERSION.jar
(Fred의 대답은 이미 이것을 말하고 있지만 그의 예는 너무 추상적입니다.)
Peter의 , 로 묶은 것은 SierraX와 Peter입니다.{}
명령에 변수를 전달하는 데 사용됩니다. 예를 들어 다음과 같습니다.
포자가 있다고 치자.유명한 이탈리아 소설의 첫 줄이 포함된 txt 파일:
> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi
출력:quel ramo del lago di como che volge a mezzogiorno
이제 두 개의 변수를 만듭니다.
# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)
# This variable will replace the word
> new_word="filone"
이제 단어 변수 내용을 inside sposi의 new_word로 대체합니다.txt 파일
> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi
출력:quel filone del lago di como che volge a mezzogiorno
"라모"라는 단어가 대체되었습니다.
언급URL : https://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-around-shell-variables
'it-source' 카테고리의 다른 글
jQuery를 사용하여 요소의 제목 속성을 변경하는 방법 (0) | 2023.05.16 |
---|---|
MVVM 모델에서 모델은 INOTIFY를 구현해야 합니다.속성 변경된 인터페이스? (0) | 2023.05.16 |
포장 풀기, 확장 포장 풀기 및 중첩 확장 포장 풀기 (0) | 2023.05.16 |
제가 다른 사람의 개인 Github repo를 제 계정으로 포크하면 제 계정에 공용 repo로 표시되나요? (0) | 2023.05.16 |
Postgre의 일부로 정수를 문자열로 변환하는 방법SQL 쿼리? (0) | 2023.05.16 |