Bash 스크립트의 명령줄에서 공백이 있는 입력을 수락하는 방법

Bash 스크립트의 명령줄에서 공백이 있는 입력을 수락하는 방법

현재 명령줄에서 입력을 받아들이는 bash 스크립트가 있지만 입력에 공백이 있고 bash 스크립트는 공백 뒤의 단어를 읽지 않습니다. 스크립트는 이렇습니다

#!/bin/bash
var1=$1
var2=$2
echo $var1
echo $var2

이 파일을 test.sh로 저장한다고 가정해 보겠습니다. 이제 내 입력은 다음과 같습니다.

./test.sh hi check1,hello world

출력은 -

hi
check1,hello

하지만 출력이 필요합니다.

hi
check,hello world

추신: 큰따옴표로 입력을 제공할 수 없으므로 공백이 있는 단어를 읽을 수 있는 다른 솔루션이 필요합니다.

답변1

그것은 불가능합니다. 매개변수의 단어 분할은 스크립트가 실행되기 전에 발생하므로 스크립트가 시작될 때 매개변수가 이미 단어로 분할되어 있습니다. man bash자세한 내용은 "단어 분할"을 읽어보세요 .

만약 너라면알다2개의 매개변수가 있습니다. 첫 번째 매개변수에는 공백이 포함되지 않습니다. 어떻게든 해결할 수 있습니다.

#! /bin/bash
first=$1
shift
rest="$*"

printf '<%s>\n' "$first" "$rest"

그러나 여전히 여러 공간을 하나로 축소합니다.

답변2

@choroba가 올바르게 지적했듯이 적어도 기본적으로는 이 작업을 수행할 수 없습니다.

그 이유는 쉘이 작업을 수행하기 전에분석하다명령줄에서 이는 잘 정의된 여러 단계를 통해 진행되는 프로세스입니다. 이러한 단계 중 하나는 "필드 분할"입니다. 여기서 쉘은 입력 행을 여러 부분으로 분할합니다. 고려하다:

명령 인수1 인수2

쉘은 "command"가 명령이고 "arg1"이 첫 번째 인수이고 "arg2"가 두 번째 인수인지 어떻게든 결정해야 합니다. 그렇지 않습니까? "arg1"이 첫 번째 인수이고 "arg1 arg2"가 아닌 이유 또는 "command"가 "command arg1"이 아닌 명령인 이유 등이 있어야 합니다.

아니요, 그렇지만 이 분할이 수행되는 방식에 영향을 미치는 두 가지 요소가 있습니다. 바로 (셸) 변수 IFS 및 OFS입니다. IFS("내부 필드 구분 기호")는 마스크가 해제된 경우 필드를 구분하는 문자 목록입니다. 위의 예에서 "arg1"은 "arg2" 및 "command"와 공백으로 구분됩니다. 이는 IFS의 일부입니다.

IFS를 직접 임의의 문자(빈 문자열 포함)로 설정할 수 있지만 기본적으로(POSIX 문서에 지정됨) "공백", "탭" 및 "줄바꿈"으로 설정됩니다. 자세한 내용은 다음을 참조하세요.IFS에 대해 알아보기.

다소 긴 일반적인 소개 후에 이것이 귀하의 질문에 대해 무엇을 의미합니까?

  1. IFS를 조작하여 필드 분할이 수행되는 방식에 영향을 줄 수 있지만 다음을 수행해야 합니다.앞으로스크립트가 시작 중입니다. 예:

    % SAVIFS="$IFS" ;IFS 내보내기=""
     % /path/to/your/script arg1 arg2 ...
     % IFS="$SAVIFS"
  2. 자신의 규칙에 따라 스크립트 내에서 필드 분할을 수행할 수 있습니다. 이렇게 하려면 캡처합니다.모두매개변수를 문자열에 넣고 직접 분할하세요.

    /bin/bash #!/bin/bash
     chArgs="$*"
     인수1=""
     인수1=""
     [...]
     shopt의 마지막 튜브
     # 여기에서 $chArgs의 내용을 분할합니다. 예를 들면 다음과 같습니다.
     echo "$chArgs" IFS='' 읽기 arg1 arg2
     printf "%s\n%s\n" "$arg1" "$arg2"
    
     # 또는 어떻게 작동하는지 보여주기 위해:
     echo "$chArgs" IFS=',' arg1 arg2 읽기
     printf "%s\n%s\n" "$arg1" "$arg2"

그러나 문자열, 특히 IFS의 문자를 포함할 수 있는 문자열을 처리할 때는 항상 올바른 인용을 준수해야 합니다. 귀하의 예에서 :

#!/bin/bash
var1=$1
var2=$2
echo $var1
echo $var2

이 올바른 참조가 누락되어 예상대로 작동하지 않는 (추가) 이유인 것 같습니다. 노력하다:

#!/bin/bash
var1="$1"
var2="$2"
echo "$var1"
echo "$var2"

관련 정보