명령 대체 내용이 포함 된 echo 변수

다음과 같은 매우 기본적인 명령 대체 스크립트를 작성했습니다.

#!/bin/bash files=$(ls *.fastq); echo $files 

디렉토리에는 .fastq 파일이 많이 포함되어 있으며 echo 명령을 사용하여 출력하고 싶습니다.

위의 sript는 각 fastq 파일 이름 사이에 공백이있는 fastq 파일을 출력합니다.

이렇게 사용하면

#!/bin/bash files=$(ls *.fastq); echo "$files" 

결과를 새 줄로 인쇄합니다.

그 이유는 무엇입니까? 명령 대체와 관련이 있습니까?

감사합니다

답변

변수를 참조 할 때 일반적으로 이름을 큰 따옴표로 묶는 것이 좋습니다. 이렇게하면 $, ` (역 따옴표) 및 (이스케이프). $를 큰 따옴표 안에 특수 문자로 유지하면 인용 된 변수 ( “$ variable”)를 참조 할 수 있습니다. 즉, 변수를 해당 값으로 대체 할 수 있습니다.

사용 단어 분할을 방지하기위한 큰 따옴표. 큰 따옴표로 묶인 인수는 공백 구분자가 포함되어 있어도 단일 단어로 표시됩니다.

variable1="a variable containing five words" COMMAND This is $variable1 # Executes COMMAND with 7 arguments: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Executes COMMAND with 1 argument: # "This is a variable containing five words" 

echo 문에 대한 인수를 큰 따옴표로 묶는 것은 단어 분리 또는 공백 유지가 문제가되는 경우에만 필요합니다.

자세한 정보와 예제는 여기

답변

ls는 줄 바꿈을 별도의 줄에 표시하므로 줄 바꿈이 있습니다. 셸 (bash)이 인용되지 않은 공백으로 구분 된 각 텍스트를 별도의 인수로 명령에 전달하기 때문에 줄 바꿈은 따옴표없이 사라집니다.

참고 : 명령 대체는 ls iv id = “ba93689221이 아니라 셸에서 수행됩니다. “>

이므로 ls가 필요하지 않습니다.

그러므로 할 수 있습니다.

#!/bin/bash echo *.fastq 

또는

#!/bin/bash files="*.fastq" echo "$files" 

댓글

  • 터미널 출력에서 ls * .fastq 실행 공백으로 구분 된 동일한 줄에서 어떻게 별도의 줄에 배치합니까?
  • 문서를 찾을 수 없지만 lsls -x이고 그렇지 않은 경우에는 ls -1와 같습니다. 따라서 ls -x를 사용하여 원하는 것을 얻으십시오.

답변

따옴표없이 변수를 참조 할 때 (예 : echo $files), 쉘은 값을 공백으로 분리하고 각 용어를 별도의 명령 줄 옵션으로 전달합니다. 줄 바꿈은 다른 공백과 동일하게 처리됩니다. echo 프로그램은 개행 문자를 전혀 보지 않습니다. 단지 각각 단일 파일 이름 인 문자열 배열을 가져옵니다.

참조 할 때 따옴표로 묶인 변수 (예 : echo "$files")에 쉘은 공백 분할을 수행하지 않습니다. 대신 수정되지 않은 전체 값을 단일 인수로 전달합니다. echo 프로그램은 개행 문자를 포함하는 하나의 긴 문자열을받습니다.

변수를 제외하고 이것은 리터럴 값을 따옴표로 묶는 것과 동일한 동작입니다. echo foo bar를 쓰면 공백이 쉘에 의해 제거되고 echofoobar 그리고 “여러 인수를 결합하도록 코딩 된 방식이므로 문자열 사이에 단일 공백이있는 문자열을 인쇄합니다. id = “097bf8a71a”>

, echo는 단일 문자열 foo bar를 가져와 그대로 인쇄합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다