다음과 같은 매우 기본적인 명령 대체 스크립트를 작성했습니다.
#!/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"
댓글
답변
따옴표없이 변수를 참조 할 때 (예 : echo $files
), 쉘은 값을 공백으로 분리하고 각 용어를 별도의 명령 줄 옵션으로 전달합니다. 줄 바꿈은 다른 공백과 동일하게 처리됩니다. echo
프로그램은 개행 문자를 전혀 보지 않습니다. 단지 각각 단일 파일 이름 인 문자열 배열을 가져옵니다.
참조 할 때 따옴표로 묶인 변수 (예 : echo "$files"
)에 쉘은 공백 분할을 수행하지 않습니다. 대신 수정되지 않은 전체 값을 단일 인수로 전달합니다. echo
프로그램은 개행 문자를 포함하는 하나의 긴 문자열을받습니다.
변수를 제외하고 이것은 리터럴 값을 따옴표로 묶는 것과 동일한 동작입니다. echo foo bar
를 쓰면 공백이 쉘에 의해 제거되고 echo
는 foo
및 bar
그리고 “여러 인수를 결합하도록 코딩 된 방식이므로 문자열 사이에 단일 공백이있는 문자열을 인쇄합니다. id = “097bf8a71a”>
, echo
는 단일 문자열 foo bar
를 가져와 그대로 인쇄합니다.
ls
는ls -x
이고 그렇지 않은 경우에는ls -1
와 같습니다. 따라서ls -x
를 사용하여 원하는 것을 얻으십시오.