bash(GNU bash, 버전 5.0.17)에서 date 명령의 출력을 대문자로 사용하려고 합니다.
date +"%d%m%Y"
# 30Dec2020
나는 대문자를 발견했습니다 ^^ 연산자는 다음과 같이 사용됩니다.
DT="$(date +"%d%b%Y")"
echo ${DT^^} # works with curly braces
# 30DEC2020
echo $(DT^^) # fails with brackets
bash: DT^^: command not found
저는 ${}에 대해 잘 모르고 이것이 $()와 어떻게 다른지 잘 모릅니다. 온라인으로 확인해 보니 모두 같은 일을 하는 것 같았습니다. 가변 확장. 미리 감사드립니다.
답변1
${}
미리 설정된 변수에는 달러 기호( )가 있는 중괄호가 사용됩니다. 다음 예를 살펴보십시오.
ThisIsAVariable=abc
echo ${ThisIsAVariable}
echo $ThisIsAVariable
마지막 명령은 동일한 내용을 인쇄합니다: abc
. 그러나 어떤 경우에는 변수를 중괄호로 묶는 것이 유용합니다. 예를 들어 스크립트에 서로 인접한 두 개의 변수가 있는 경우 중괄호를 사용하면 한 변수를 다른 변수와 명확하게 구분하는 데 도움이 됩니다. 예를 들어:
echo ${ThisIsAVariable}${PWD}
셸과 이 스크립트를 읽는 사람은 누구나 "ThisIsAVariable"과 "PWD"가 서로 다른 두 변수라는 것을 쉽게 알 수 있습니다.
중괄호는 변수 배열을 사용하는 유일한 방법이기 때문에 중요합니다. 우리가 다음 파일 을 포함하는 디렉토리에 있다고 가정 합니다 1.txt
. 이를 염두에 두고 다음 사항을 고려하십시오.2.txt
3.txt
file[0]=1.txt
file[1]=2.txt
file[2]=3.txt
echo $file
echo ${file[2]}
처음 세 명령은 단지 변수를 설정하기 때문에 출력이 없습니다. 그러나 네 번째 명령은 1.txt
. 이 변수는 쉘에 인쇄할 배열을 명시적으로 알려주지 않고 호출되므로 기본값은 #0입니다. 다섯 번째 줄은 인쇄할 것이기 때문에 가장 흥미롭습니다 3.txt
. 내가 한 일은 file
배열 #2를 사용하여 변수를 호출한 것뿐인데, 보시다시피 이 배열은 3.txt
.
중괄호를 사용하여 수행할 수 있는 다른 작업은 다음과 같습니다.
x=123-45
echo ${x//-*}
echo $x
두 번째 명령은 기본적으로 "하이픈 뒤의 모든 항목을 제거합니다"로 해석됩니다. 따라서 x는 여전히 문자열과 동일하지만 필터링되었습니다 123-45
. -45
마지막 명령의 출력은 123-45
예상한 대로입니다.
교정기 확장에 대해서는 배울게 많지만... 뭐... 아직 배워본 적이 없어서 가르치기 시작도 못하겠네요.
즉, $()
달러 기호( )가 붙은 괄호는 command substitution
전혀 다른 것을 의미한다. 기본적으로 프로세스 대체는 하나의 명령이 다른 명령의 매개변수를 생성하도록 하는 것입니다. 이 예를 살펴보십시오.
ls
ls -l
ls $(echo -l)
마지막 두 명령의 출력이 동일하다는 것을 다시 한 번 알 수 있습니다. 이는 마지막 줄에 인수 가 echo
제공되어 위의 명령과 본질적으로 동일하기 때문입니다. 가끔은 당신이 그냥ls
-l
필요한 프로그램의 출력은 다른 프로그램의 입력이 되어 자동화됩니다. 이것은 까다로울 수 있지만 운 좋게도 BASH와 같은 *nix 쉘을 사용하면충분한이를 달성하는 방법. (이 질문의 범위를 벗어나기 때문에 언급하지 않겠습니다. 하지만 배울 수 있는 곳을 기꺼이 찾으신다면만능 가이드즉시. 흥미 롭군. )