728x90

#!/bin/bash

# 최소한 10 개의 매개변수를 줘서 이 스크립트를 실행시키세요. 예를 들면,
# ./scriptname 1 2 3 4 5 6 7 8 9 10

echo

echo "스크립트 이름은 \"$0\"."
# 현재 디렉토리를 나타내는 ./ 가 추가되어 있죠.
echo "스크립트 이름은 \"`basename $0`\"."
# 경로명을 떼어 냅니다('basename' 참고).

echo

if [ -n "$1" ]              # 테스트 할 변수를 쿼우트 해줬습니다.
then
 echo "첫번째 매개변수는 $1"  # # 을 이스케이프 시키기 위해서 쿼우트를 해 줘야 됩니다.
fi 

if [ -n "$2" ]
then
 echo "두번째 매개변수는 $2"
fi 

if [ -n "$3" ]
then
 echo "세번째 매개변수는 $3"
fi 

# ...

if [ -n "${10}" ]  # $9 보다 큰 매개변수는 {중괄호}로 감싸야 됩니다.
then
 echo "열번째 매개변수는 ${10}"
fi 

echo

exit 0

 


variable1_=$1_
# 이렇게 해주면 위치 매개 변수가 비어있더라도 에러를 막아줍니다.

critical_argument01=$variable1_

# 실제로 변수를 쓸 곳에서 다음처럼 해주면 에러 방지용 문자가 잘려 나갑니다.
variable1=${variable1_/_/}   # $variable1_ 이 "_"로 시작할 때만 부효과(Side effects)가 있습니다.
# 9장에서 논의할 매개변수 치환중의 한 가지 방법을 써서 변경 패턴을 삭제해 줍니다.

#  좀 더 확실한 방법은 원하는 위치 매개변수가 넘어 왔는지 테스트를 해 보는 것입니다.
if [ -z $1 ]
then
  exit $POS_PARAMS_MISSING
fi  

 

 - 성공여부와 상관없이 다음 명령어 실행

한 줄에 여러 명령어를 순서대로 배열할 때는 ;를 구분자로 사용합니다. 아래 명령어는 test를 만든 후에 test 디렉토리로 이동합니다. 

1
mkdir test;cd test

&& - 성공한 경우에 다음 명령어 실행

&&의 의미

&&는 앞의 명령어가 실행되었을 때 성공한 경우에 다음 명령어를 실행합니다. ;와는 다릅니다. 예를들어보죠. 아래와 같은 명령어가 있을 때

1
mkdir test; cd test; touch abc

test 디렉토리가 이미 있어서 아래와 같은 상황이라고 해보죠. 

mkdir test(실패); cd test; touch abc

이 경우 cd test가 실행되고, touch abc도 실행됩니다. 

 

반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다. 

mkdir test(실패) && cd test && touch abc

성공&실패와 무관하게 연속적으로 실행해야 할 명령이 있을 때 ;를 씁니다. 이전 명령이 성공했을 때 다음 명령을 실행하려면 &&를 씁니다. 대체로 &&를 쓰는게 좋을 때가 많습니다. 좀 더 정확하게는 &&는 이전 명령어의 실행결과가 참(true)일 때만 다음 명령을 실행합니다. 아래 내용은 참고삼아 읽어보세요. 

 

if test condition-true if [ condition-true ] 은 완전히 똑같은 표현입니다. [  test 명령어를 부르는 토큰이기 때문에 ] 가 꼭 필요하진 않지만 새 버전의 bash 에서는 그래도 있어야 됩니다.

참고: test 명령어는 파일 타입을 테스트하거나 문자열을 비교해 주는 bash 내장 명령이기 때문에, Bash 스크립트안에서 test sh-utils 패키지의 일부분인 /usr/bin/test 외부 명령어를 부르지 않습니다. 비슷하게, [ /usr/bin/test로 링크되어 있는 /usr/bin/[를 부르지 않습니다.






2) set 명령과 위치 매개변수

        -> 위치 매개변수를 재설정하면 기존의 값들은 잃어버리게 된다

        -> 모든 위치 매개변수의 설정을 해제하려면 'set --' 명령을 사용한다

        -> $0는 언제나 스크립트 이름을 가리킨다

            $ cat test
            #!/bin/bash
            echo The name of this script is $0
            echo The arguments are $*
               
                => $*은 모든 위치 매개변수를 의미한다

            set $(date)
            echo The date is $2, $3, $6.


            $ ./test a b c d
            The name of this script is ./test
            The arguments are a b c d
            The date is 11., 21., KST.


            $ cat test
            #!/bin/bash
            name=${1:?"requires an argument"}
            echo Hello $name

                => 특수 변수 변경자인 :?는 $1이 값을 가지고 있는지 검사한다

                => 지정한 값이 없으면 스크립트를 종료하고 메시지를 출력한다


            $ ./test
            ./test: line 2: 1: requires an argument

            $ ./test aaa
            Hello aaa


        -> $*와 $@의 차이

            => $*와 $@의 의미는 큰 따옴표 안에서 사용되는 경우에만 서로 다르다
           
            => 큰 따옴표 안에 $*를 사용하는 경우에는 매개변수들이 단일 문자로 취급된다

            => $@를 큰 따옴표 안에 사용하면 매개변수들은 서로 분리된 문자로 인식된다

                $ set 'aaa bbb' ccc ddd
                $ for i in $*
                > do
                > echo $i
                > done
                aaa
                bbb
                ccc
                ddd

                $ set 'aaa bbb' ccc ddd
                $ for i in "$*"
                > do
                > echo $i
                > done
                aaa bbb ccc ddd

                    > $*이 큰 따옴표 안에 들어있기 때문에 전체 매개변수를 하나의 문자열로 처리한다


                $ set 'aaa bbb' ccc ddd
                $ for i in $@
                > do
                > echo $i
                > done
                aaa
                bbb
                ccc
                ddd

                $ set 'aaa bbb' ccc ddd
                $ for i in "$@"
                > do
                > echo $i
                > done
                aaa bbb
                ccc
                ddd

                    > $@가 큰 따옴표 안에 있으므로 각 위치 매개변수를 개개의 문자열로 처리한다


출처: https://linuxism.ustd.ip.or.kr/57 [linuxism]

728x90

'Linux' 카테고리의 다른 글

[쉘 스크립트] 반복문 예제  (0) 2022.02.24
[쉘스크립트]$((...))  (0) 2022.02.24
[쉘스크립트] 변수 치환  (0) 2022.02.23
0 1 2 (표준입력, 표준출력, 표준 에러)  (0) 2022.02.22
[쉘스크립트] 2022-02-22 예제  (0) 2022.02.22

+ Recent posts