indyK1ng : "#"은 다음 문자를 이스케이프하기 때문에 "#"은 주석으로 처리되지 않습니다. "$ #"은 현재 컨텍스트에 존재하는 위치 매개 변수의 수를 나타내는 내부 변수입니다. 이것은 쉘 스크립트에 대한 명령 행 인수의 수로 생각할 수 있지만 내장 된 "set - [args]"를 사용하여 어레이를 재설정 할 수 있습니다.
Joakim Elofsson : if 문의 전체 구조 올바른지, ";" 별도의 줄에 나열되지 않은 경우 "그 다음"과 "fi"앞에 필요합니다.
문제는 "0"과 브래킷 사이의 간격입니다. Bash는 조건식을 구분하는 데 사용되는 대괄호는 표현식에서 적어도 하나의 공백으로 설정해야한다고 요구합니다.
if [ $# -eq 0] || [ $# -gt 2 ] # Wrong
if [ $# -eq 0 ] || [ $# -gt 2 ] # Correct
두 개의 조건식을 결합 할 수 있습니다. 운영자 협회는 모든 것이 잘 작동하는지 확인합니다.
if [ $# -eq 0 -a $# -gt 2 ] # Even Better
표현 평가를 위해 이중 브래킷과 함께 제공되는 확장 기능을 선호하는 경향이 있습니다. 두 평가의 조합은 다른 연산자로 수행됩니다. 나는 이것이 더 읽기 쉽다고 생각한다.
if [[ $# -eq 0 || $# -gt 2 ]] # My preference
나중에 스크립트에서 정수 추가에 단일 대괄호를 사용하지 않는 것이 좋습니다. 단일 대괄호는 표현식을 부울로 평가합니다. 정수 연산에는 두 배의 괄호가 사용됩니다.
echo $[ $1 + $1 ] # Evaluation of an expression
echo $(($1 + $1)) # Integer math
약간의 역사 : 이것은 '['는 역사적으로 쉘에 내장되어 있지만 인수로 표현식을 수신하고 결과를 반환 한 별도의 실행 파일이기 때문입니다.'['를 공백으로 묶지 않으면 쉘은 다른 파일 이름을 찾기 위해 $ PATH를 검색합니다 (찾을 수 없습니다). –