스크립트의 Bash 기록: `!#:*`

스크립트의 Bash 기록: `!#:*`

나는 읽고 있었다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

매우 멋진 도구입니다.

관련 정보