나는 다음과 같은 매우 기본적인 명령 대체 스크립트를 작성했습니다.
#!/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
그대로 인쇄합니다.