인용 부호는 "단어 분할"을 방지합니다. 즉, 공백 문자 (또는 기본 $IFS쉘 변수 의 값에 정의 된대로 공백, 탭 및 줄 바꿈)에서 변수를 여러 항목으로 분류합니다 .
예를 들어
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
여기에 howmany얼마나 많은 위치 매개 변수가 제공되는지 알려주 는 함수를 정의합니다 . 보시다시피, 변수에 전달되는 두 개의 항목이 있으며 따옴표로 변수의 텍스트가 하나의 단위로 처리됩니다.
정보를 정확하게 전달하는 데 중요합니다. 예를 들어, 변수에 파일 경로가 있고 파일 이름에 경로 어딘가에 공백이 있으면 실행하려는 명령이 실패하거나 부정확 한 결과를 제공 할 수 있습니다. $var변수 를 사용하여 파일을 만들려고하면 touch $var두 개의 파일이 있지만 touch "$var"하나만 생성됩니다.
당신도 마찬가지입니다 [ "$currentoutput" != "$lastoutput" ]. 이 특정 테스트는 두 문자열을 비교합니다. 테스트가 실행될 때 [명령은 3 개의 인수 (텍스트 문자열, !=연산자 및 다른 텍스트 문자열)를 확인해야합니다. 큰 따옴표를 유지하면 단어가 분리되는 것을 막을 수 있으며 [명령은이 세 가지 인수를 정확하게 봅니다. 변수를 따옴표로 묶지 않으면 어떻게됩니까?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
여기서 단어 분리가 발생하고 대신 [두 개의 문자열 hello과 world그 뒤에 !=, 두 개의 다른 문자열이 표시됩니다 hi world. 핵심은 큰 따옴표없이 변수의 내용은 하나의 전체 항목이 아닌 별도의 단위로 이해된다는 것입니다.
명령 대체를 할당 할 때와 같이 큰 따옴표가 필요하지 않습니다.
var=$( df )
당신은이 곳에 df명령의 출력이 저장 var. 그러나 $(...)실제로 출력을 별도의 항목으로 처리하지 않으려는 경우 변수를 큰 따옴표로 묶고 명령 대체를 사용하는 것이 좋습니다.
부수적으로
while [ true ]
일부가 될 수 있습니다
while true
[인수를 평가하는 명령 [ whatever ]이며 내부 내용에 관계없이 항상 참입니다. 대조적으로, 항상 성공 종료 상태를 반환 while true하는 명령 true을 사용하십시오 (그리고 정확히 while루프가 필요합니다). 차이점은 조금 더 명확하고 테스트가 덜 수행된다는 것입니다. 또는 :대신에 사용할 수도 있습니다true
큰 따옴표는 echo "" date and Time부분적으로 제거 될 수 있습니다. 그들은 단지 빈 문자열을 삽입하고 출력에 여분의 공간을 추가합니다. 원하는 경우 자유롭게 보관하십시오. 그러나이 경우 특별한 기능적 가치는 없습니다.
lsusb >> test.log
이 부분은 아마도로 대체 될 수 있습니다 echo "$currentoutput" >> test.log. lsusb에서 이미 실행 한 후 다시 실행할 이유가 없습니다 currentoutput=$(lsusb).
출력 에서 후행 줄 바꿈 을 유지 해야하는 경우 -명령을 여러 번 실행하는 값을 볼 수 있지만 lsusb필요하지 않은 경우 . 내장 명령이 아닌 명령을 호출 할 때마다 CPU, 메모리 사용 및 실행 시간 (명령이 메모리에서 사전로드되어 있음)이 발생하기 때문에 호출하는 외부 명령이 적을수록 좋습니다.
또한보십시오:
while [ true ]무한 루프를 생산하지만, 아마도하지 않는 이유 당신이하지 생각합니까;while [ false ]또한 단일 인수를 사용[ ... ]하면 인수가 비어 있지 않은 문자열이면 성공 하므로 무한 루프가 생성 됩니다.while true실제로는 항상 성공하는 이름의 명령을 실행 합니다true.