본문 바로가기
Linux

2.6 본쉘

by 평범한kiki 2023. 2. 5.

* SHELL 특수파라미터 변수들

$* 이 파라미터는 변수는 1부터 시작하는 위치 파라미터의 확장이며, 큰따옴표로 구분하고, IFS특수 변수의 첫번째 문자로 구분회는 각 파라미터의 값으로 하나의 단어를 확장하며, 전체파라미터값을 가지고 있다. 만약 IFS가 NULL이거나 해제되어 있으면 파라미터는 스페이스로 구분한다. 
$@ 이 파라미터 변수는 1부터 시작하는 위치 파라미터의 확장이며, 큰따옴표로 확장되면 각 파라미터는 하나의 구분 단어로 확장되고 전체 파라미터값을 가진다.
$# 이 파라미터 변수는  십진수 위치 파라미터 전체 개수를 의미한다.(args의 총 개수)
$? 가장 최근에 실행된 포그라운드 파이프라인의 종료상태를가지고 있다. 
$- 실행되자마자 set 내장명령을 통해 또는 쉘 자체에의해 설정된 옵션 플래그로 확장한다.
$$ 현재 쉘의 프로세스 ID를 가지고 있다.
$! 가장 최근에 백그라운드로 실행된 프로세스의 ID를 가지고 있다.
$0 쉘 또는 쉘스크립트의 이름을 가지고 있다.
$_ 이 변수는 쉘이 시작되면 설정되는데, 아규먼트 목록을 사용하여 실행된 쉘스크립트의 절대경로를 가지고 있다.  어떤 명령이 이전에 실행되었다면 이전에 실행된 명령에서 사용한마지막 아규먼트의 절대경로를 가지게 된다. 

 

 

* 사용자 입력값 받기

- read 명령오른쪽에 적는 변수에 사용자 입력값을 할당

#!/bin/sh

echo "Start read Test"
read name
read address

echo $name
echo "${address}"

 * 명령 치환

- 리눅스 명령의 결과를 변수로 할당하기 위해서

  또는 명령의 결과를 문자열로 사용하기 위해서는 백쿼터(``)를 사용하여 명령 감싸주어야 함

#/bin/sh

now=`date`
echo $now
echo "오늘은 `date` !!"
comm.sh (END)

* 연산자

- 동치

 = 문자열 , != 문자열,  -eq 숫자 ,  -ne 숫자

- 논리

 -a:and , -o:or , !:not

- 관계

 -gt : 보다크다

 -ge : 보다 크거나같다

 -lt : 보다 작다

 -le : 보다 작거나 같다

 

* 조건문

- [if~then]

if 명령
then
   명령 문장 블록
elif 명령
then
   명령 문장 블록
else
   명령 문장 블록
fi

if [표현식]
then
   명령 문장 블록
elif [표현식]
then
   명령 문장 블록
else
   명령 문장 블록
fi

- [case]

case 변수 in
 패턴1)
   문장
   ;;
 패턴2)
   문장
   ;;
  *) 기본값 지정을 위한 문장
   ;;
esac

* 루프문

- while, until, for

- while

while 테스트문장
do
  문장
done

#!/bin/sh

number=0
while [ $number -lt 10 ]
do
echo "$number"
number=`expr $number + 1`
done

echo "script complete"

- for

for loop-index in 리스트
do
 문장
done

#!/bin/sh

for fruit in apples oranges pears bananas
do
echo "${fruit}"
done

echo "script complete"

* 파일테스팅

- 결과값은 0(true), 1(false)

- man test 로 설명파일 볼 수 있다.

- 자주사용하는 test명령 옵션들

 -d 파일: 파일이 존재하면서 디렉토리인지 테스트

 -f 파일 : 파일이 존재하면서 디렉토리가 아니라 파일인지 테스트

 -r 파일 : 현재 사용자가 읽을 수 있는 파일인지 테스트

 -s 파일 : 파일이 존재하면서 크기가 0보다 큰지 테스트

 -w 파일: 현재 사용자가 파일에 쓰기가 가능한지 테스트

 -x 파일 : 현재 사용자가 파일을 실행할 수 있는지 테스트

 -z 문자열: 만약 문자열 길이가 0이면 참

 -n 문자열: string 문자열의 길이가 0이 아니라면 

표현식1 -a 표현식2 : 표현식1과 표현식2가 둘다 참이면 true (-a -> and)

표현식1 -o 표현식2 : 표현식1과 표현식2 둘중 하나라도 참이면 true (-o -> or)

#!/bin/sh

if [ -f file ]  //file이 존재하는지
then
 echo "file exists"
else
 echo "file not found"
fi

if [ -r file -a -w file ] //file 현재사용자가 읽을수 있는지 && 현재사용자가 쓰기가능한 파일인지
then
 echo "file is readable and writable"
else
 echo "file is not read/write"
fi

* 함수

- function_name(){}

- 함수에서 사용된 변수, 함수해제시 unset 함수명 (unset 변수)

#!/bin/sh

pathmunge(){
    echo "call pathmunge $1 $2"
    echo $@
    echo "======================"
    echo ! echo $PATH

    # $PATH에서 $1로 보낸 경로가 있는지 확인
    # /bin/egrep -q 으로 정규식 검색가능, (^|:)$1($|:) -> 경로 앞뒤로 :가 없거나 있거나
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"; then
        if [ "$2" = "after" ]; then
            echo "called firest"
            #PATH=$PATH:$1
        else
            echo "called second"
            #PATH=$1:$PATH
        fi
    fi
}

#path
pathmunge /sbin
pathmunge /usr/sbin

for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        echo "{$i}"
    fi
done

#clear
unset i
unset pathmunge

=== 결과

ubuntu@instance-20221119-1126:~$ ./testcommand.sh
call pathmunge /sbin
/sbin
======================
! echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/us r/local/games:/snap/bin
call pathmunge /usr/sbin
/usr/sbin
======================
! echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/us r/local/games:/snap/bin
{/etc/profile.d/01-locale-fix.sh}
{/etc/profile.d/Z97-byobu.sh}
{/etc/profile.d/Z99-cloud-locale-test.sh}
{/etc/profile.d/Z99-cloudinit-warnings.sh}
{/etc/profile.d/apps-bin-path.sh}
{/etc/profile.d/bash_completion.sh}
{/etc/profile.d/cedilla-portuguese.sh}
{/etc/profile.d/gawk.sh}

'Linux' 카테고리의 다른 글

[Linux] centos 여러버전 jdk 관리  (0) 2023.05.08
[Linux] centos wget  (0) 2023.05.08
2.7 bash shell  (0) 2023.02.18
2.1 리눅스의 부팅 과정과 로그인 쉘  (0) 2023.01.21