나는 읽고 있었다LPIC-1 학습 가이드.
echo "This is a sentence. " !#:* !#:1->text3
echo
위의 코드 줄이 어떻게 명령을 여러 번 반복 할 수 있는지 이해할 수 없습니다 . 기록 기능을 사용하고 있다는 것을 알고 있지만 또는 에 대한 문서를 bash
찾을 수 없습니다 . 누군가 나에게 이것을 설명해 줄 수 있습니까?!#:*
!#:1
답변1
예, 이것은 기록을 사용하는 것입니다.
!#
는역사적 사건 지표
지금까지 입력한 전체 명령줄을 의미합니다.
:*
는 0번째 단어를 제외한 모든 단어를 가리키는 단어(범위) 표시입니다. 따라서 를 입력하면 로 확장 echo "This is a sentence. "
됩니다 . 그리고 (이것은!#:*
"This is a sentence. "
x-y
엑스그리고와이는 정수)는 단어 수를 나타내는 단어(범위) 표시입니다.엑스단어 수로와이. 만약에와이( x-
)를 생략하면 단어 수를 나타내는 것으로 해석됩니다.엑스두 번째 단어로. 그래서 "지금까지 입력한 전체 명령줄" 이후
echo "This is a sentence. " "This is a sentence. "
그러면 이는 !#:1-
로 확장됩니다 "This is a sentence. "
. 인용된 각 "This is a sentence. "
문자열은 단어로 계산되므로 (단어 번호 1만) !#:1-
과 동일합니다 . !#:1
그래서 당신은 결국
echo "This is a sentence. " "This is a sentence. " "This is a sentence. " >text3
-
명령에 the 와 the 가 함께 표시된다는 사실은 >
혼동의 문제일 뿐입니다. 그리고 "이것은 문장이다"라는 사실. 인용하면 무슨 일이 일어나고 있는지 모호해집니다.
echo This is a sentence. !#:* !#:1-
다음으로 확장될 예정입니다.
echo This is a sentence. This is a sentence. !#:1-
그럼
echo This is a sentence. This is a sentence. This is a sentence. This is a
( !#:1-
단어 1부터 끝에서 두 번째 단어까지 확장되기 때문입니다.)
답변2
Peter Krumins의 bash 기록 치트 시트에 대한 좋은 문서를 찾을 수 있습니다.여기.
이제 이해하셨으니 , 및 에 대해 !#
설명하겠습니다 .:*
:1
*
: 0번째 단어를 제외한 모든 단어를 나타냅니다.x-
: x부터 끝에서 두 번째 단어까지의 단어를 나타냅니다.
따라서 귀하의 명령은 다음과 같습니다.
echo "This is a sentence. " !#:* !#:1-
!#:*
0번째 것을 제외한 모든 것을 얻으려면 을 얻으려면"This is a sentence. "
명령은 다음과 같습니다.echo "이것은 문장입니다." ".!#:1-
1부터 두 번째 단어, 마지막 단어까지 이는"This is a sentence. "
명령이 다음과 같이 됨을 의미합니다.echo "이것은 문장입니다." "이것은 문장입니다." "이것은 문장입니다."
답변3
@glennjackman이 지적했듯이 이것은 모두 bash 매뉴얼에서 다룹니다. 매뉴얼 페이지에서 검색하십시오 HISTORY EXPANSION
.
!#
는이벤트 표시기"지금까지 입력한 전체 명령줄"을 의미합니다. 귀하의 예에서echo "This is a sentence. "
마지막 큰따옴표 뒤에 후행 공백을 포함하십시오.:
분리된이벤트 표시기(!#
) 에서단어 표시기(*
).*
는단어 표시기"0번째 단어를 제외한 이벤트의 모든 단어"를 의미합니다.
그래서 echo "This is a sentence. " !#:*
확장
echo "This is a sentence. " "This is a sentence. " $
(달러 기호는 후행 공백을 나타내는 내 것입니다.) 이것은 다음과 일치합니다.
This is a sentence. This is a sentence. $
터미널로 (다시 말하지만 달러 기호는 공백의 끝을 나타내는 내 것입니다).
두번째이벤트 표시기:단어 표시기pair( !#:1-
)는 유사한 방식으로 작동합니다(그러나 첫 번째 표시기 쌍이 평가된 이후 명령줄이 크게 확장되었다는 사실을 처리해야 한다는 점을 기억하십시오).
답변4
나는 시도 !#:*
했고 !#:1
. 온라인에서 많은 리소스를 찾을 수는 없지만 하나를 소개한 echo "Sample text"
다음 !#:* !#:1 !#:2->text
!#:*를 사용하여 문자열 내용을 임시로 저장할 수 있을 것이라고 확신합니다. 너무 많은 리소스를 찾을 수 없어서 이것이 조건문인지는 확실하지 않지만, 동일한 내용을 작성하려고 하고 키 입력을 저장하려고 할 때 유용할 것 같습니다. 나는 이것을 Bash에서 시도했습니다.
echo "test" !#:* !#:1 !#:2 !#:3 !#:4->test1
test1에서 얻은 결과는 다음과 같습니다.
test test test test test test
매우 멋진 도구입니다.