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

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

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

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

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

위 스크립트는 각 fastq 파일 이름 사이에 공백이 있는 fastq 파일을 출력합니다.

이렇게 사용하다보니

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

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

왜 그럴까요? 이것은 명령 대체와 관련이 있습니까?

감사해요

답변1

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

참고: 명령 대체는 쉘에 의해 수행됩니다.어쩔 수 없지ls, 따라서 그럴 필요가 없습니다 ls.

그러므로 당신은 할 수 있습니다

#!/bin/bash
echo *.fastq

또는

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

답변2

변수를 참조할 때 일반적으로 이름을 큰따옴표로 묶는 것이 좋습니다. 이렇게 하면 $, `(백틱) 및 \(이스케이프)를 제외하고 인용된 문자열의 모든 특수 문자가 재해석되지 않습니다 . 큰따옴표 안에 특수 문자를 남겨두면 $따옴표로 묶인 변수("$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 문의 매개변수를 큰따옴표로 묶어야 합니다.

자세한 내용과 예시를 보려면 다음을 방문하세요.여기

답변3

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

따옴표 안에 변수를 인용하면(예: echo "$files") 쉘은 공백 분할을 수행하지 않고 수정되지 않은 전체 값을 다음과 같이 전달합니다.하나의토론. 프로그램 echo은 개행 문자가 포함된 긴 문자열을 받습니다.

변수를 제외하면 이는 리터럴 값을 따옴표로 묶는 것과 동일한 동작입니다. 을 쓰면 echo foo bar쉘은 공백을 제거하고 echo문자열 sum만 가져오고 foo, bar여러 인수를 결합하여 인코딩하는 방식이므로 문자열 사이에 공백이 있는 문자열을 인쇄합니다. echo "foo bar"을 쓰면 echo단일 문자열을 가져와 foo bar그대로 인쇄합니다.

관련 정보