초보자 가이드 BASH - 조건 및 변수

소개

"BASH 초보자 안내서"의 세 번째 파트에 오신 것을 환영합니다. 이전 두 기사를 놓친 경우이 가이드를 다른 BASH 스크립팅 가이드와 다른 점이 무엇인지 알고 싶을 것입니다.

이 가이드는 BASH의 초보자가 작성한 것이며 독자가 배울 때 배우는 독자입니다. 내가 BASH의 초심자 인 반면, 필자가 작성한 대부분의 것들이 Windows 플랫폼을위한 것이었지만 소프트웨어 개발 배경에서 왔습니다.

다음 두 가지 가이드를 볼 수 있습니다.

BASH 스크립팅을 처음 사용하는 경우이 가이드를 계속하기 전에 처음 두 가이드를 읽는 것이 좋습니다.

이 가이드에서는 조건문을 사용하여 사용자 입력을 테스트하고 스크립트 기능을 제어하는 ​​방법을 강조합니다.

rsstail 설치

이 가이드를 따르려면 RSS 피드 를 읽는 데 사용되는 rsstail이라는 명령 줄 응용 프로그램을 설치해야 합니다 .

데비안 / 우분투 / 민트 기반 배포판을 사용하는 경우 다음을 입력하십시오 :

sudo apt-get install rsstail

Fedora / CentOS의 경우 다음을 입력하십시오 :

냠 설치 rsstail

openSUSE의 경우 다음을 입력하십시오 :

zypper 설치 rsstail

IF 문

터미널을 열고 다음을 입력하여 rssget.sh 파일을 만듭니다.

sudo nano rssget.sh

나노 편집기에서 다음 텍스트를 입력하십시오 :

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

CTRL과 O를 눌러 파일을 저장 한 다음 CTRL과 X를 눌러 종료하십시오.

다음을 입력하여 스크립트를 실행하십시오.

sh rssget.sh

스크립트는 linux.about.com RSS 피드에서 제목 목록을 반환합니다.

한 RSS 피드에서 제목을 검색하기 때문에 지나치게 유용한 스크립트는 아니지만 Linux.about.com RSS 피드의 경로를 기억하지 않아도됩니다.

nano에서 rssget.sh 스크립트를 다시 열고 다음과 같이 파일을 편집하십시오.

#! / bin / bash

if [$ 1 = "verbose"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

다음을 입력하여 스크립트를 다시 실행하십시오.

sh rssget.sh 자세한 정보 표시

이번에는 RSS 피드가 제목, 링크 및 설명과 함께 제공됩니다.

스크립트를 자세히 분석해 보겠습니다.

#! / bin / bash는 우리가 작성하는 모든 스크립트에 나타납니다. 다음 줄은 기본적으로 사용자가 제공 한 첫 번째 입력 매개 변수를보고 "verbose"단어와 비교합니다. 입력 매개 변수와 단어 "verbose"가 일치하면 thenfi 사이의 행이 실행됩니다.

위의 스크립트에는 분명히 결함이 있습니다. 입력 매개 변수를 전혀 제공하지 않으면 어떻게됩니까? 대답은 예기치 않은 연산자의 줄을 따라 오류가 발생한다는 것입니다.

다른 주요 결함은 "verbose"라는 단어를 제공하지 않으면 아무 일도 일어나지 않는다는 것입니다. 이론상으로 verbose라는 단어를 제공하지 않으면 스크립트는 제목 목록을 반환합니다.

nano를 다시 사용하여 rssget.sh 파일을 편집하고 다음과 같이 코드를 수정하십시오.

#! / bin / bash

if [$ 1 = "verbose"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

파일을 저장하고 다음을 입력하여 실행하십시오.

sh rssget.sh 자세한 정보 표시

제목, 설명 및 링크 목록이 나타납니다. 이제 다음과 같이 다시 실행하십시오.

sh rssget.sh 제목

이번에는 제목 목록 만 나타납니다.

스크립트의 나머지 부분은 4 행에 있으며 else 문을 소개합니다. 기본적으로 스크립트에서는 첫 번째 매개 변수가 "verbose"라는 단어 인 경우 RSS 피드의 설명, 링크 및 제목을 가져 오지만 첫 번째 매개 변수가 다른 제목 일 경우 제목 목록 만 얻습니다.

스크립트는 약간 개선되었지만 여전히 결함이 있습니다. 매개 변수를 입력하지 못하면 오류가 발생합니다. 매개 변수를 제공하더라도 장황하게 말하지는 않는다고해서 제목 만 원한다는 것을 의미하지는 않습니다. 예를 들어 자세한 내용의 철자를 잘못 입력했거나 비둘기를 입력했을 수도 있습니다.

이러한 문제를 해결하기 전에 IF 문과 관련된 명령을 하나 더 보여 드리고자합니다.

rssget.sh 스크립트를 다음과 같이 편집하십시오.

#! / bin / bash

if [$ 1 = "모두"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "설명"]
그때
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

나는 "verbose"라는 단어를 없애고 모든 단어로 대체하기로 결정했다. 그것은 중요한 부분이 아닙니다. 위의 스크립트는 ELSE IF를 짧은 방법으로 소개하는 elif 를 소개합니다.

이제 스크립트는 다음과 같이 작동합니다. sh rssget.sh를 모두 실행하면 설명, 링크 및 제목을 얻을 수 있습니다. 대신 sh rssget.sh 설명 을 실행하면 제목과 설명 만 얻을 수 있습니다. 다른 단어를 입력하면 제목 목록을 얻을 수 있습니다.

이것은 조건문의 목록을 빨리 찾아내는 방법을 소개합니다. ELIF를 수행하는 다른 방법은 중첩 된 IF 문으로 알려진 것을 사용하는 것입니다.

다음은 중첩 된 IF 문이 작동하는 방법을 보여주는 예제입니다.

#! / bin / bash

if [$ 2 = "aboutdotcom"]
그때
if [$ 1 = "모두"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "설명"]
그때
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
그밖에
if [$ 1 = "모두"]
그때
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "설명"]
그때
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

원하는 경우 rssget.sh 파일에 해당 내용을 모두 입력하거나 복사하여 붙여 넣으십시오.

위의 스크립트는 RSS 피드 인 "about.com"또는 "lxer.com"을 선택할 수있는 두 번째 매개 변수를 소개합니다.

실행하려면 다음을 입력하십시오.

sh rssget.sh 모두 aboutdotcom

또는

sh rssget.sh all lxer

물론 모든 설명이나 제목을 모두 바꿔 설명이나 제목 만 제공 할 수 있습니다.

기본적으로 위의 코드는 두 번째 매개 변수가 aboutdotcom이면 두 번째 매개 변수가 lxer 인 경우 이전 스크립트와 동일한 두 번째 if 문을보고 다음 내부 if 문을 다시보고 제목, 설명을 표시할지 여부를 결정합니다 또는 모든 것.

이 스크립트는 순전히 중첩 된 IF 문에 대한 예제로 제공되며이 스크립트에 많은 문제가있어이 스크립트를 모두 설명하는 또 다른 기사가 필요할 것입니다. 주요 문제는 확장 성이 없다는 것입니다.

Everyday Linux 사용자 또는 Linux Today와 같은 RSS 피드를 추가하기를 원한다고 가정 해보십시오. 스크립트가 거대 해지고 내부 IF 문이 변경되기를 원한다고 결정하면 여러 위치에서 변경해야합니다.

중첩 된 IF를위한 시간과 장소가 있기는하지만 그들은 간과해서는 안됩니다. 일반적으로 중첩 된 IF가 필요 없도록 코드를 리팩터링하는 방법이 있습니다. 나는이 주제에 대해 앞으로의 기사에서 다룰 것이다.

더프 매개 변수를 입력하는 사람들의 문제를 수정하는 방법을 살펴 보겠습니다. 예를 들어 위의 스크립트에서 사용자가 두 번째 매개 변수로 "aboutdotcom"이 아닌 다른 것을 입력하면 사용자가 lxer를 입력했는지 여부에 관계없이 LXER의 RSS 피드에서 기사 목록이 나타납니다.

또한 사용자가 첫 번째 매개 변수로 "all"또는 "description"을 입력하지 않으면 기본값은 사용자가 의도 한 것이거나 될 수없는 제목 목록입니다.

다음 스크립트를 보거나 rssget.sh 파일에 복사하여 붙여 넣으십시오.

#! / bin / bash

if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
그때
if [$ 1 = "모두"] || [$ 1 = "설명"] || [$ 1 = "제목"]
그때
if [$ 2 = "aboutdotcom"]
그때

if [$ 1 = "모두"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "설명"]
그때
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
그밖에
if [$ 1 = "모두"]
그때
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "설명"]
그때
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

첫 번째로 주목해야 할 점은 스크립트가 상당히 커지고 컨트롤이 중첩 된 IF 문이 어 떻게 될 수 있는지 빠르게 볼 수 있다는 것입니다.

이 스크립트에서 중요한 비트는 IF 문입니다. || 문 다음 줄 2와 4 줄.

|| OR을 나타냅니다. 그래서 라인은 [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] 는 두 번째 매개 변수가 "aboutdotcom"또는 "lxer"와 같은지 확인합니다. 그렇지 않으면 가장 바깥 쪽 IF에 대한 else 문이 없으므로 IF 문이 완료 됩니다.

마찬가지로 4 행에서 [$ 1 = "all"] || [$ 1 = "설명"] || [$ 1 = "title"] 첫 번째 매개 변수가 "all"또는 "description"또는 "title"과 같은지 확인합니다.

이제 사용자가 sh rssget.sh 감자 치즈를 실행하면 LXER 에서 제목 목록을 받기 전에는 아무것도 반환되지 않습니다.

반대쪽 || &&입니다. && 연산자는 AND를 나타냅니다.

스크립트를 악몽처럼 보이게 만들 예정이지만 사용자가 2 개의 매개 변수를 제공했는지 확인하는 것이 중요합니다.

#! / bin / bash

if [$ # -eq 2]
그때

if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
그때
if [$ 1 = "모두"] || [$ 1 = "설명"] || [$ 1 = "제목"]
그때
if [$ 2 = "aboutdotcom"]
그때

if [$ 1 = "모두"]
그때
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "설명"]
그때
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
그밖에
if [$ 1 = "모두"]
그때
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "설명"]
그때
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
그밖에
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

그 스크립트에서 여분의 비트는 다음과 같은 또 다른 외부 IF 문입니다 : if [$ # -eq 2] . 입력 매개 변수에 대한 기사를 읽으면 $ #가 입력 매개 변수 개수를 반환한다는 것을 알 수 있습니다. -eq는 equals를 나타냅니다. 따라서 IF 문은 사용자가 2 개의 매개 변수를 입력했는지 확인하고 그렇지 않은 경우 아무것도 수행하지 않고 종료합니다. (특히 우호적이지는 않음).

나는이 튜토리얼이 상당히 커지고 있음을 알고있다. 이번 주에는 더 많은 내용을 다루지는 않겠지 만, 끝나기 전에 스크립트를 정리하는 데 도움이되고 싶습니다.

조건문에 대해 알아야 할 마지막 명령은 CASE 문입니다.

#! / bin / bash


if [$ # -eq 2]
그때
case $ 2 in
aboutdotcom)
case $ 1 in
모든)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
기술)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
표제)
rst-
;;
에삭
;;
렉서)
case $ 1 in
모든)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
기술)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
표제)
rst-
;;
에삭
;;
에삭
fi

case 문은 ELSE IF ELSE IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF IF.

예를 들어이 논리

IF 과일 = 바나나
그 다음엔
ELSE IF 과일 = 오렌지
그 다음엔
포도주의 경우 과일 = 포도
그 다음엔
END IF

다음과 같이 다시 쓸 수 있습니다 :

케이스 과일
바나나)
이 작업을 수행
;;
오렌지)
이 작업을 수행
;;
포도)
이 작업을 수행
;;
에삭

기본적으로 첫 번째 항목은 비교하려고하는 것입니다 (예 : 과일). 괄호 앞에있는 각 항목은 비교 대상이고 앞의 행과 일치하면 ;; 도망 갈거야. case 문은 reverse esac (대문자와 소문자)로 끝납니다.

rssget.sh 스크립트에서 case 문은 그 끔찍한 중첩을 제거하지만 실제로 충분히 개선하지는 못합니다.

스크립트를 실제로 개선하려면 변수를 소개해야합니다.

다음 코드를 살펴보십시오.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

if [$ # -lt 2] || [$ # -gt 2]
그때
echo "사용법 : rssget.sh [all | description | title] [aboutdotcom | lxer]";
출구;
fi

case $ 1 in
모든)
display = "- d -l -u"
;;
기술)
display = "- d -u"
;;
표제)
display = "- u"
;;
에삭

case $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
렉서)
url = $ lxer;
;;
에삭
rsstail $ display $ url;

변수는 이름을 지정하고 값을 할당하여 정의됩니다. 위의 예에서 변수 할당은 다음과 같습니다.

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

스크립트는 변수를 사용하여 즉시 관리 할 수 ​​있습니다. 예를 들어, 각 매개 변수는 별도로 처리되므로 중첩 IF 문은 없습니다.

display 변수는 all, description 또는 title 중 어느 것을 선택했는지에 따라 설정되며 url 변수는 aboutdotcom 변수 또는 lxer 변수를 선택했는지에 따라 aboutdotcom 변수 값 또는 lxer 변수 값으로 설정됩니다.

이제 rsstail 명령은 display 및 url 값을 올바르게 실행해야합니다.

변수에 이름을 지정하는 것만으로 변수를 설정하는 반면 실제로 변수를 사용하려면 변수 앞에 $ 기호를 추가해야합니다. 즉, variable = value는 변수를 값으로 설정하는 반면 $ variable은 나에게 변수의 내용을 제공합니다.

다음은이 자습서의 최종 스크립트입니다.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "사용법 : rssget.sh [all | description | title] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
display = ""
url = ""

if [$ # -lt 2] || [$ # -gt 2]
그때
echo $ usage;
출구;
fi

case $ 1 in
모든)
display = "- d -l -u"
;;
기술)
display = "- d -u"
;;
표제)
display = "- u"
;;
*)
echo $ usage;
출구;
;;
에삭

case $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
렉서)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ usage;
출구;
에삭

rsstail $ display $ url;

위의 스크립트는 더 많은 RSS 피드를 소개하고 사용자가 2 개의 변수를 입력하지 않거나 변수에 잘못된 옵션을 입력하는 경우 스크립트 사용 방법을 알려주는 사용 변수가 있습니다.

개요

이것은 서사시적인 기사 였고 지나치게 빨리 지나갔을 수도 있습니다. 다음 글에서는 IF 문에 대한 모든 비교 옵션을 보여 드리며 변수에 관해서는 더 많은 이야기가 있습니다.

또한 위의 스크립트를 개선하기 위해 더 많은 작업을 수행 할 수 있습니다.이 작업은 루프, grep 및 정규 표현식을 탐색 할 때 향후 가이드에서 다루게 될 것입니다.

l inux.about.com의 How To (카테고리 목록을 스크롤하여 항목 목록 아래로 스크롤) 섹션을 참조하여 이중 부팅 Windows 및 Ubuntu 에서 그놈 상자를 사용하여 가상 컴퓨터설정하는 데 유용한 가이드를 찾으십시오.