* 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 |