각 파일에 대해서는 read, write, execute 할 수 있는 권한이 있다.
명령어1)
$ ls -l | awk '$1~/^-/{print $0}'
=> "-" : regular file 을 의미.
즉 ls -l 명령어를 regular file 에 대해서만 실행하겠다는 것
( = regular file 에 대해서만 정보를 확인한다.)
=> print $0 에서 $0 : 다 보겠다는 것을 의미.
출력결과 : -rw-r--r--
=> 해석 : 해당 regular file 에 대해
owner 는 읽고 쓰는 권한만 있고,
group 은 읽는 권한만 있고,
others 는 읽는 권한만 있다는 것
=======================================================
명령어2)
$ ls -l | awk '$1~/^d/{print $0}'
=> "^d" : directory file 에 대해서만 확인
출력결과 : brw-rw---- : 해당 block special file 에 대해
umask (user mask) : 파일에 디폴트 권한을 부여하는 것
0022 분석
0 : - (regular file)
0 : --- (rwx 권한 중에 아무권한도 없음)
2 : user
2 : group
=> 해석 : user 와 group 에게 regular file 에 대한 write 권한을
부여하지 않겠다는 것
형태 : chmod < mode > < file/directory name >
1.Octal Mode
2.Symbolic Mode
$ chmod u-x hello.sh
=> hello.sh 파일에 대해 user 가 실행할 권한을 제거
$ chmod ugo-rx hello.sh
=> hello.sh 파일에 대해 u(user), g(group), o(owner) 가
read 하고 write 할 수 있는 권한을 제거
$ chmod a=rw hello.sh
=> a(all을 의미. 즉, user + group + owner) 가
read 하고 write 할수 있는 권한을 부여 (이때는 대입연산자 = 를 사용)
$ chmod +x hello.sh
=> (a를 생략가능함) a 에게 실행한 권한을 추가
u : owner
x : 실행할 권한
모든 shell interpreter 는 "#!" 로 시작한다. 이때 "#!" 를 shebang 이라고 한다.
우리가 스크립트를 실행시 interpreter 가 실행된다.
이떄의 interpreter 의 종류를 알려준다.
( bash 말고도 다양한 shell 이 있고 기능이 달라서, 알려줘야함 )
$ x.sh {A..Z} => A~Z 까지 26개의 인자가 전달됨
echo $4 ${15] $7 $3 $1 ${20}
=> shell script 내부에서 $1, $2, ... 와 같은 positional parameter 를 사용할 수 있다.
$0 : 현재의 shell script 의 이름을 출력
$# : positional parameter 의 개수를 출력
$* : 모든 positional parameter 를 출력
$? : 가장 최근에 마지막으로 실행된 종료상태(Exit Status) 값을 출력
$$ : current process 의 pid 값을 출력
cf) pid(Process ID)는 운영체제에서 프로세스를 식별하기 위해 프로세스에 부여하는 번호를 의미한다.
#! /bin/bash
=> shabang
INUM=$(stat $1 | awk '$3~"Inode"{print $4}'
=> stat 이라는 명령어를 통해 첫번쨰 인자(= 내가 보고자하는 파일)
에 대해 awk 로 출력문을 작성.
첫번쨰 인자(파일 정보) 의 3번째 열에서 "Inode" 라는게 있다면 4번쨰 인자를 출력
- 형태1 : read (할당시켜줄 변수명)
- 형태2 : read -p (문구) (할당시켜줄 변수명)
- 형태3 : read -s (할당시켜줄 변수명) : 사용자가 입력하는 문자열이 화면에 보이지 않도록하며 입력을 받아옴
아래와 같이 read 로 한번에 여러 변수에다 데이터를 입력받고 할당할 수 있다.
"-s" 옵션을 부여할시, 데이터를 입력받고 있을때 해당 데이터가 화면에 출력되지 않음
"-p" 옵션을 추가해서 데이터를 입력받을 때 문구를 추가가능
1) awk -v num = $n '$1==num {print $0}' | wc -1
=> n은 상수가 아닌 변수이다.
awk 의 "-v" 옵션 : 변수를 만드는 옵션
"-v" 윱션을 통해, $n 이라는 변수를 num 이라는 변수로 보자고 설정하는 것
=> 즉, num 이라는 변수를 생성하고 $n 변수가 가지고 있던 값을 할당하는 것이다.
positional parameter 인 $1 와 num 의 값이 같으면 출력한다.
==============================================
2) if [ $response -eq 0 ]
=> 앞서 선언한 shell 변수인 response 의 값이 0과 같다면 실행
형태1 : test 테스트해볼 구문
형태2 : [ 테스트해볼 구문 ]
"-eq" : equals
"-gt" : greater than
"-lt" : less than
예제
예제
if ls &> /dev/null; then echo yes; fi
=> ls 명령어의 실행결과가 false 라면, 에러메시지를 모두 블랙홀로 보낸다.
반대로 true 라면 "yes" 를 출력헌다.
$ if [ -n "kor" ]
=> 문자열 "kor" 의 길이가 0이 아닌지
$# : 해당 shell program 에 전달받은 인자의 개수
if [ $# -ne $NARGS] : 전달받은 인자의 개수가 2개가 아닌지 판단
read password 에서 문자열을 입력할떄 아무 것도 입력하지 않고
null 문자열이 할당된다.
그런데 if 문안에서는 "=" 는 이항 연산자로써 2개의 피연산자(인자)를 비교해야 하는데
$password 라는 인자에 null 문자열이 할당되어서 에러가 발생할 수 있다.
=> 그래서 일반적으로 shell 변수를 다룰때는 문자열일떄 큰 따옴표를 붙여서
직관적으로 명시하는 것이 좋다. 이러면 null string 문제도 발생하지 않음!
if [-n "$BASH_VERSION" ]
=> BASH_VERSION 이 0이 아니라면 == bash 버전에 설치되어있다면
if [ -f "$HOME/.bashrc" ]
=> HOME 디렉토이안에 hashrc 라는 regular file 이 존재한다면
. "$HOME/.bashrc"
=> 명령어 "." : shell script 를 실행시키는 명령어
(즉 $HOME/.bashrc 라는 쉘 스크립트를 실행시킨다)
case 변수명 in
pattern ) // 첫번째 case 절
command-list ;;
pattern ) // 두번쨰 case 절
command-list ;;
.
.
.
command-list ;; // 그냥 pattern 없이 실행문만 적으면, 디폴트 문이 된다.
esac
각 pattern (case절) 은 위에서 보듯이 와일드카드를 가질 수 있다.
( => 와일드카드 종류 : *, ?, a~z 사이의 문자 등등)
다수의 pattern 들은 "|", "&" 등의 연산자로 처리가능
예제
무한 while 루프는 test command 자리에 true 를 넣으면 끝!
형태
while true
do
실행구문 ~~
done
둘은 완전히 동일한 기능을 수행하는 프로그램이다.
단 while 문은 true 일떄, until 은 false 일떄 실행되므로
둘다 동일하게 실행되기 위해서는 while 문에 있는 test-command 조건을 반대로 뒤집어서 until 문의 test-command 에 넣으면 된다.
( while 문은 변수 n이 5보다 작을때 실행하는데, until 문은 5보다 클때 수행한다. )
for 반복변수 in 리스트
do
명령들~~
done
1.숫자들 - ex) for i in 1 2 3 4 5
2.리눅스 명령어 실행결과 - ex) for i in $(seq 1 5)
3.문자열 - ex) for fruit in apple grape orange
4.파일이름 - ex) for frname in *
5.command line arguments
cf) seq 명령어 : 주어진 범위에 있는 숫자들을 출력하는 명령어
ex) $(seq 1 5) => 1 ~ 5 사이의 숫자들을 출력