bash 스크립팅 : 인수가이 문자열과 같으면이 문자열과 같은 변수를 정의하십시오.


225

나는 bash 스크립트를하고 있으며 이제 다음과 같이 하나의 변수 호출 source과 하나의 배열 samples이 있습니다.

source='country'
samples=(US Canada Mexico...)

소스 수를 확장하고 (각 소스마다 자체 샘플이 있음)이 작업을 수행하기 위해 몇 가지 인수를 추가하려고했습니다. 나는 이것을 시도했다 :

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

그러나 스크립트를 실행할 source countries.sh country때 작동하지 않았습니다. 내가 뭘 잘못하고 있죠?


2
어떻게 작동하지 않습니까? 실행할 때 오류가 발생하거나 "다시 시도"또는 다른 것이 표시됩니까?
evil otto

2
예, 당신은 '질문이 매우 간단하다'고 생각할 것입니다. 하지만 당신은 이것에 대해 한동안 생각하고있었습니다. 필요한 출력과 오류 메시지가 포함되도록 질문을 편집하십시오. 실제로 무언가를 시도하고 좋은 형식의 질문에 +1합니다. 행운을 빕니다.
shellter

이 코드가 제안되고 승인 된 솔루션과 동일한 이유는 무엇입니까? 혼란 스럽습니다 ... 초기 질문에 여는 괄호 바로 다음과 if 문장의 닫는 괄호 앞에 공백이없는 것 같아요?
Stef

6
당신이 자세히 본다면 @Stef $1="country"$1 = "country"

답변:


413

공백을 잊지 마십시오 :

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

121
나는 이것에 3 시간을 소비한다고 믿을 수없고, 공간의 문제 일 뿐이다 !!!! ... 감사합니다 @Alex
Alejandro

1
samples="US Canada Mexico..."이전에 어레이 생성을 도입 한 후에 사용 samples=(US Canada Mexico...)합니까?
사용자 알 수 없음

10
왼쪽의 변수가 빈 문자열 일 때이 문제가 발생했습니다. 수정되었습니다 if [ "$1" = "country" ]; then.
andrewb

8
알았어. Bash는 공식적으로 가장 오래되었지만 여전히 사용되는 명령 언어에 대한 내 투표를 얻었습니다. 문법은 너무 직관적이지 않아서 아파요. 2016 년에는 실제로 장소가 없습니다. @Systemd authors : 다음 프로젝트를 "빠르지 않는 리눅스 쉘 만들기"로 만들 수 있습니까? 나는 당신에게 돈을 던져 것입니다.
masi

3
@masi 가끔 유닉스의 원래 의도는 "불명을 통한 작업 보안"이라고 생각합니다. 도구가 사용하기에 이해하기 어려우며 이해하기 어렵고 일반적으로 내부 지식이 마스터에서 패드 완으로 전달되지 않고 씻지 않은 사람들의 손이 닿지 않는 경우, "알고있는"사람들을위한 작업이 항상있을 것입니다. 이 철학은 전체 "RFC"구조와 사람 문서에 사용되는 꽃이 많은 언어에서 분명합니다.이 도구는 도구를 사용하는 방법을 기술적으로 알려주면서 실제로 도구를 문서화해야한다는 요구 사항을 충족시키기 위해 존재했습니다. 조금 변경되었습니다.
동기화되지 않은

184

bash에서 문자열 비교에 "="또는 "=="연산자를 사용할 수 있습니다. 중요한 요소는 괄호 안의 간격입니다. 올바른 방법은 괄호 안에 간격을 포함하고 연산자는 간격을 포함하는 것입니다. 어떤 경우에는 다른 조합이 작동합니다. 그러나 다음은 보편적 인 예입니다.

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

또한 이중 괄호는 단일 괄호와 비교하여 약간 다르게 처리됩니다.

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

도움이 되길 바랍니다.


12

커맨드 라인 인수를 bash 스크립트로 파싱하려고합니다. 나는 최근에 이것을 직접 검색했다. 나는 논쟁을 파싱하는 데 도움이 될 것으로 생각되는 다음을 발견했습니다.

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

아래 코드를 tl; dr로 추가했습니다.

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts ht:r:p:v OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t 테스트 -r 서버 -p 비밀번호 -v

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.