현재 명령줄에서 입력을 받아들이는 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에 대해 알아보기.
다소 긴 일반적인 소개 후에 이것이 귀하의 질문에 대해 무엇을 의미합니까?
IFS를 조작하여 필드 분할이 수행되는 방식에 영향을 줄 수 있지만 다음을 수행해야 합니다.앞으로스크립트가 시작 중입니다. 예:
% SAVIFS="$IFS" ;IFS 내보내기="" % /path/to/your/script arg1 arg2 ... % IFS="$SAVIFS"
자신의 규칙에 따라 스크립트 내에서 필드 분할을 수행할 수 있습니다. 이렇게 하려면 캡처합니다.모두매개변수를 문자열에 넣고 직접 분할하세요.
/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"