it-source

우리는 언제 조개 변수 주변에 곱슬곱슬한 중괄호가 필요합니까?

criticalcode 2023. 5. 16. 22:44
반응형

우리는 언제 조개 변수 주변에 곱슬곱슬한 중괄호가 필요합니까?

셸 스크립트에서 다음을 사용하는 경우{}변수를 확장할 때?

예를 들어, 다음을 보았습니다.

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

반응형