갑자기 헤더
- macOS : ⌘ + ⌥ + H
- Linux / Windows : Ctrl + Alt + H.
https://blog.naver.com/cwook0219/222139249054
[42서울] 라피신 최종 후기 겸 자문자답 겸 여러 팁
비밀도 많고, 피곤함도 많은 이상한 시스템을 가진 42서울의 라피신 기간을 끝낸 누군가입니다. 혹여나 자...
blog.naver.com
연습문제 00: Exam machine
• 주중에 Agenda에서 금요일 시험에 등록할 수 있습니다 — 잊지 말고 꼭 등록하세요.
• 첫번째 시험 Exam00 도 반드시 등록해야 합니다.
• 금요일에 있을 머신 시험에 이벤트에도, 프로젝트에도 등록이 되어 있는지 확인하세요.
• 그리고 이벤트와 프로젝트 둘 다에 등록되었는지 다시 한 번 확인하세요.
연습문제 01: print_groups
제출할 파일: print_groups.sh
디렉토리: ex01/
허용 함수: 없음
• 환경 변수 FT_USER에 지정된 로그인 사용자가 속한 그룹들의 리스트를 쉼표(,)로
구분하고 공
백 없이 출력하는 셸 명령어를 작성하세요.
힌트: man id
연습문제 02: find_sh
제출할 파일: find_sh.sh
디렉토리: ex02/
허용 함수: 없음
• 현재 디렉토리와 그 하위 디렉토리에서 이름이 ".sh"로
름만 출력하는 셸 명령어를 작성하세요.
끝나는 파일들을 찾아서, 확장자 없이 이
연습문제 03: count_files
제출할 파일: count_files.sh
디렉토리: ex03/
허용 함수: 없음
• "현재 디렉터리와 그 하위 디렉터리에 있는 일반 파일과 디렉터리의 개수를, 시작 디렉터리인 '.'
도 포함하여 출력하는 명령어 한 줄을 작성하시오."
연습문제 04: MAC
제출할 파일: MAC.sh
디렉토리: ex04/
허용 함수: 없음
"당신의 컴퓨터의 MAC 주소들을 출력하는 명령어 한 줄을 작성하시오.
각 MAC 주소는 줄바꿈으로 구분되어야 합니다."힌트: man ifconfig
연습문제 05: Can you create it ?
제출할 파일: \?$*'MaRViN'*$?\
디렉토리: ex05/
허용 함수: 없음
• 내용이 정확히 "42"만 포함된 파일을 생성하세요. 그
• 파일 이름은 다음과 같아야 합니다 :
외 아무것도 포함되어 있으면 안 됩니다.
🎉 Milestone 달성, 계속해서 전진하세요!
연습문제 06
제출할 파일: skip.sh
디렉토리: ex06/
허용 함수: 없음
• ls -l 명령 결과에서 첫 줄부터 시작해 한 줄 건너 한 줄씩 출력하는 셸 명령어를 작성하세요.
즉, ls -l로 나오는 목록에서
1번째, 3번째, 5번째... 이런 식으로 홀수 번째 줄만 출력하는 명령어를 작성하라는 뜻이야.
연습문제 07: r_dwssap
제출할 파일: r_dwssap.sh
디렉토리: ex07/
허용 함수: 없음
• 다음 과정을 수행하는 셸 명령어를 작성하세요:
◦ cat /etc/passwd 결과 출력
◦ 주석 제거
◦ 두 번째 줄부터 시작해 한 줄 걸러 출력
◦ 로그인 이름을 역순으로 뒤집기
◦ 알파벳 역순으로 정렬
◦ 환경변수 FT_LINE1부터 FT_LINE2까지 해당 줄만 선택
◦ 로그인 이름들을 **", "(쉼표+공백)**로 구분해서 나열하고, 마침표로 끝나야 함(.)
연습문제 08: add_chelou
제출할 파일: add_chelou.sh
디렉토리: ex08/
허용 함수: 없음
• 환경변수 FT_NBR1(기수: '\"?!) 와 FT_NBR2(기수: mrdoc)의 값을 해석하여 합산하고,
• 그 결과를 **기수: gtaio luSnemf**로 변환해 출력하는 셸 명령어를 작성하세요.특정 진법으로 표현된 변수 FT_NBR1와 FT_NBR2에 들어있는 숫자를 더해서, 결과를 다른 진법으로
출력하는 한 줄 명령어를 작성하세요.
• FT_NBR1는 진법 "?!"
• FT_NBR2는 진법 mrdoc
• 그리고 합은 진법 gtaio luSnemf로 출력해야 합니다.
쉽게 말하자면 -G -> 모든 그룹 ID (숫자, 공백으로 구분)
-u -> 사용자 ID 출력 (숫자)
-n -> 숫자 아이디 대신 이름 출력
-Gn 모든 그룹 아이디를 숫자 아이디 대신 이름 출력
id -nG username 여기서 username은 FT_USER
그리고 내용은 , 쉼표로 나눠주기
따라서 명령어 tr 을 적어준다.
id -nG FT_USER | tr ' ' ',' | tr -d '\n'
tr를 사용해서 공백대신 -> 쉼표로 구분
-d 는 delete을 의미, 줄바꿈 없이.
문제에서 공백없이 오로지 쉼표로만 구분하라고 했기에, 이렇게 적어줘야 한다.
문제풀이 :
어제 공부한거 복습하면서 적어보기
find . -name '*.sh' -type f -exec basename {} .sh \;
찾아라
. 현재 디렉터리 부터
-name .sh로 끝나는
-type f 파일
-exec 앞의 명령어에서 값을 받아온다. (조건을 가지고 찾은 파일들을 대상으로 다음 명령어를 실행하라!)
exec를 사용하여 검색한 대상에 추가 명령어를 수행하기
basename 은 파일 이름만 알려준다. 예를 들어서, basename /home/jisoo/ex09/ft_magic 이것을 ft_magic 출력
경로를 알려주지 않고 이름만 뺴준다는 의미
예를 들어 basename /home/jisoo/script.sh 이렇게 나왔다면 다 빼고 이름만 출력 script.sh
근데 find 라는 명령어와 함께쓰면 전체 경로가 나온다. 따라서 basename {} 이렇게 적어줘서 find 가 찾은 경로를 지워주는 것
basename 뒤에 오는 .sh 는 파일 이름에서 .sh 부분은 지워라는 뜻.
-exec는 명령어고 이는 ; 이게 나와서 명령이 끝났다는걸 표시해준다. 근데 ; 는
명령어를 연속적으로 실행해주는 것
예 : clear;ls -> clear 실행 후, ls 실행
이를 막기 위해서 \ 넣어준다.
shell01
2022.02.01 작성 ># 01 print_groups tr = translate characters 사용 방법 : groups $FT_USER | tr ' ' ',' | tr -d '\n' or id -nG $FT_USER | tr ' ' ',' | t
velog.io
https://pdseulpace.tistory.com/17
day 03 shell01
ex01 print_groups 1. groups $FT_USER | sed 's/ /,/g' 2. id -Gn ★틀린 이유★ ★ tr -d '\n' : 개행 지우기 ★ 1. sed 사용법 sed (stream editor) : 그래픽 인터페이스가 없는 명령행 유틸리티임 그래서 많은 편집 작업을
pdseulpace.tistory.com
https://coding-factory.tistory.com/804#google_vignette
[Linux] 리눅스 find 명령어 사용법 (파일 찾기, 검색)
find 명령어 리눅스의 find 명령어는 리눅스 파일 시스템에서 파일을 검색하는 데 사용되는 명령어입니다. 다양한 표현식을 사용하여 원하는 파일의 목록을 추출할 수 있습니다. 리눅스 find 사용
coding-factory.tistory.com
https://etloveguitar.tistory.com/33
Linux Shell Script - find (리눅스에서 파일, 디렉토리 찾는 법)
타겟 : find 명령어가 궁금하신 분들 읽는 법: 당장의 커맨드가 궁금하신 분들은 Easy Command 원리가 궁금한 분들은 find in detail까지 읽기 Easy Command 현재 디렉토리 하위에 존재하는 파일 중에 이름이
etloveguitar.tistory.com
[리눅스] sed 명령어의 기본적인 사용방법
리눅스에서 grep 명령과 비슷하게 사용할 수 있는 sed 명령어, 익숙하지는 않지만 사용방법에 대해서 어느 정도 알고 있다면 리눅스에서 파일을 관리하거나 원하는 데이터를 추출하는 데 있어서
wiseworld.tistory.com
https://velog.io/@1984/shell01
shell01
2022.02.01 작성 ># 01 print_groups tr = translate characters 사용 방법 : groups $FT_USER | tr ' ' ',' | tr -d '\n' or id -nG $FT_USER | tr ' ' ',' | t
velog.io
find 파일/ 디렉토리를 재귀적으로 찾아
. 현재 디렉토리에서 시작해라
| (파이프) 앞 명령의 표준 출력(stdout) 을 다음 명령의 표준 입력(stdin)으로 연결하는 연산자
wc = word count (단어/줄/바이트 세기) 명령
-l 옵션은 라인(줄) 수를 센다. 즉, find .가 출력한 줄의 개수 = 항목의 개수
출력 형식: wc -l은 숫자를 오른쪽 정렬해서 출력하므로 앞에 공백들이 붙을 수 있음.
예: " 4\n" 처럼 공백+숫자+개행을 내보냄
jisoobaek@pc-263 ~ % ls -l ex02
total 48
-rw-r--r-- 1 jisoobaek staff 542 Sep 2 20:48 a
-rw-r--r-- 1 jisoobaek staff 542 Sep 2 20:48 b
drwxr-xr-x 3 jisoobaek staff 96 Sep 2 18:23 ex04
drwxr-xr-x 3 jisoobaek staff 96 Sep 2 19:06 ex05
drwxr-xr-x 3 jisoobaek staff 96 Sep 2 19:35 ex06
drwxr-xr-x 3 jisoobaek staff 96 Sep 3 19:40 ex09
-rw-r--r-- 1 jisoobaek staff 9216 Sep 2 18:06 exo2.tar
-rw-r--r-- 1 jisoobaek staff 24 Sep 2 19:00 git.commit.sh
-rw-r--r-- 1 jisoobaek staff 0 Sep 2 20:49 sw.diff
drwx--xr-x 2 jisoobaek staff 64 Jun 1 20:47 test0
drwxr-xr-x 2 jisoobaek staff 64 Sep 2 23:25 test00
-rwx--xr-- 1 jisoobaek staff 4 Jun 1 21:46 test1
drwxr-xr-x 2 jisoobaek staff 64 Sep 2 23:25 test11
dr-x---r-- 2 jisoobaek staff 64 Jun 1 22:45 test2
-r-----r-- 2 jisoobaek staff 1 Jun 1 23:44 test3
-rw-r----x 1 jisoobaek staff 2 Jun 1 23:43 test4
-r-----r-- 2 jisoobaek staff 1 Jun 1 23:44 test5
lrwxrwxrwx 1 jisoobaek staff 5 Jun 1 22:20 test6 -> test0
-rw-r--r-- 1 jisoobaek staff 0 Sep 2 23:24 testt0
-rw-r--r-- 1 jisoobaek staff 0 Sep 2 23:24 testt1
-rw-r--r-- 1 jisoobaek staff 0 Sep 2 23:24 testt2
jisoobaek@pc-263 ~ % cd ex02
jisoobaek@pc-263 ex02 % find . | wc -l
26
총 몇개인지 입력이 되는데 숫자 앞에 공백이 너무 많다. 이 공백을 없애줘야한다.
그렇게 하기 위해서 명령어 sed 사용
sed = stream editor 텍스트 변환 도구
's/.../.../' → substitute(치환) 명령어 형식
- 앞부분(...)의 패턴을 찾아서
- 뒷부분(...)으로 바꿔라
s 는 찾아서 바꾸라는 뜻
^문자열의 맨 시작, 앞 줄
* 스페이스 + * (0회 이상 반복) -> 공백이 0회 이상 반복, 맨 앞에 있는 모든 공백을 의미
/ / 이것을 빈 문자열로 바꿔라
-> 줄 맨 앞에 있는 공백 다 지워
find . | wc-l | sed s/^ */ / → "줄 맨 앞의 공백(0개 이상)을 스페이스 하나로 바꿔라"라는 뜻이 돼 (띄어쓰기 안된다) wc 띄어쓰기 -l
find . | wc -l | sed 's/^ *//' -> ' ' 사용해야 안전하다. (쉘이 오해하지 않게)
문제풀이 :
ifconfig 네트워크 인터페이스(예: en0, lo0 등)의 정보(주소, 상태, MAC, MTU 등)를 출력하는 명령어.
여기서 ether 라는 단어가 MAC 주소(하드웨어 주소) 라인이므로, ether가 포함된 줄을 골라내면 MAC 주소 줄만 얻을 수 있다.
| 파이프, 앞 명령의 출력(stdout)을 다음 명령의 입력(stdin)으로 전달한다.
여기서는 ifconfig의 전체 텍스트를 grep으로 넘겨준다.
grep -w "ether"
grep : 입력에서 특정 패턴(문자열)을 포함한 줄만 골라 출력.
-w : 단어 단위 일치 (패턴이 단독 단어로 나왔을 때만 매치). 예: ether만 매치하고 someetherfoo 같은 부분 문자열은 매치하지 않음.
결과: ifconfig에서 ether가 들어간 줄들만 출력된다.
cut -d ' ' -f2
cut : 입력을 구분자(delimiter)로 분할해서 필드를 추출하는 도구.
-d ' ' : 구분자를 공백(스페이스) 로 지정한다
-f2 : 두 번째 필드를 출력하라는 뜻.
ifconfig | grep -w "ether" | cut -d ' ' -f2
문제풀이 :
https://pdseulpace.tistory.com/17?category=952240
day 03 shell01
ex01 print_groups 1. groups $FT_USER | sed 's/ /,/g' 2. id -Gn ★틀린 이유★ ★ tr -d '\n' : 개행 지우기 ★ 1. sed 사용법 sed (stream editor) : 그래픽 인터페이스가 없는 명령행 유틸리티임 그래서 많은 편집 작업을
pdseulpace.tistory.com
특수문자는 각자 기능이 있기 때문에, 순수히 일반문자로만 사용하려면 \를 이용해야 한다
이해가 잘 안간다. 아무리해도 안됐었다. 드디어 넣었다.
echo -n 42 |tr -d '\n' >\"\\\?\$\*'MaRViN'\*\$\?\\\" 아마 이렇게 적었더랬지....
우선 echo 42라고 적으면 \n 여기까지 세트다. 근데 문제에서는 "42"만 적으세요. 라고 적혀있어서 \n 부분을 뺐다.
-n 이렇게 후에 tr-d '\n' 이것도 띄어쓰기 부분 없애달라고 하는 뜻인데, 따라서 안적어도 되는데 그냥 적었다.
tr = translate or delete characters (문자 치환/삭제).
-d : 지정한 문자를 삭제.
예: echo "42!" | tr -d "!" → 결과 = 42
그리고 일반문자로 사용하기 위해 특수문자 앞에 \ 넣기.
깃에 올릴때도 복붙하지 말고 타이핑 해야된단다.
git add ex05/"\"\?\$*'MaRViN'*\$?\\\""
dquote 자꾸 나오는데, 탈출 방법은 " + 엔터
애 많이 먹은 문제다 ㅠㅠㅠㅠ 그냥 적고 올려버리자...사실 다 올리고 나면 git에서는 문제 요구 사항에 맞게 잘 나오더라.
아니면 주변 사람들에게 물어보기 !! **
문제풀이 :
https://recipes4dev.tistory.com/171
리눅스 awk 명령어 사용법. (Linux awk command) - 리눅스 파일 텍스트 데이터 검사, 조작, 출력.
1. awk 명령어. 대부분의 리눅스 명령들이, 그 명령의 이름만으로 대략적인 기능이 예상되는 것과 다르게, awk 명령은 이름에 그 기능을 의미하는 단어나 약어가 포함되어 있지 않습니다. awk는 최
recipes4dev.tistory.com
https://zzsza.github.io/development/2017/12/20/linux-6/
리눅스 awk 사용법
awk awk : 데이터를 조작하고 리포트를 생성하기 위해 사용하는 언어입니다. 리눅스에서 사용하는 awk는 GNU 버전의 gawk로 심볼릭 링크되어 있습니다 간단한 연산자를 명령라인에서 사용할 수 있으
zzsza.github.io
https://m.blog.naver.com/jinp7/221968878382
awk 이용해서 다른 파일에 포함된 내용 추출 NR==FNR
drop-seq에서 특정 barcode의 BAM 파일만 추출하려면 아래의 코드를 이용하면 된다. 여기서 awk의 명령...
blog.naver.com
ls -l | awk 'NR % 2 == 1'
ls -l 명령은 현재 디렉토리의 **상세 리스트(long format)**를 보여준다.
우리가 원하는 것은 첫 줄(1번째), 세 번째 줄(3번째), 다섯 번째 줄(5번째)
| 파이프 ls -l의 출력 결과를 바로 다음 명령어로 넘기기 위해 파이프(|)를 사용
awk는 라인 단위로 처리하는 텍스트 도구
'NR % 2 == 1' 뜻을 풀어보면
NR: awk 내장 변수, 현재 줄 번호(Number of Record)
NR % 2: 줄 번호를 2로 나눈 나머지
== 1: 나머지가 1인 줄만 출력
문제풀이 :
cat /etc/passwd 명령어의 출력 결과에서 주석은 삭제하고 두 번째 행부터 시작하여 다른 모든 행들은 출력하되, 각 login들 거꾸로 반전시키고 알파벳 역순으로 정렬한 후, FT_LINE1 과 FT_LINE2 을 포함한 그 사이의 값들만 남겨두세요. 이 때, 각login은 ","로 구분되어야 하며 출력 결과는 "."로 끝나야 합니다.(큰따옴표 없이)
cat /etc/passwd | sed '/#/d' | cut -d ':' -f1 | awk "NR % 2 == 0" | rev | sort -r | awk "NR >= $FT_LINE1 && NR <= $FT_LINE2" | tr '\n' ',' | sed 's/,/, /g' | sed 's/, $/./' | tr -d '\n'
먼저 /etc/passwd 의미는 무엇일까, 이걸 터미널에 cat과 함께 적어보면 시스템 사용자 계정 정보가 들어있다.
sed '/#/d' 이거는 우선 #부분 delete 해라 ! #는 주석이다. 따라서 주석 줄 삭제하라는 뜻
cut -d ':' -f1 cut은 구분자로 필드를 잘라내는 명령, -d ':' → :를 구분자로 사용, -f1 → 첫 번째 필드만 선택
첫번째 필드 로그인 이름만 적어라 ?
awk "NR % 2 == 0"
- awk는 라인 단위 처리 도구입니다.
- NR → 현재 줄 번호(Number of Record)
- NR % 2 == 0 → 짝수 줄만 선택 (두 번째 줄부터 한 줄씩)
- 따라서 **두 번째 줄, 네 번째 줄, …**의 로그인 이름만 남습니다.
une ligne sur deux en partant de la seconde"
직역하면 "두 번째 줄부터 시작해서 한 줄에 하나(=한 줄 건너)씩" 이라는 뜻이에요.
즉 출력되는 줄은 2, 4, 6, ... (짝수 줄) 입니다.
(반대로 “첫 줄부터 한 줄 건너”면 1,3,5...가 됩니다.)
rev는 문자열을 뒤집음(reverse) 예) daemon → nomaed
sort -r sort는 정렬 명령어, -r → 역순(reverse) 정렬, 따라서 로그인 이름이 알파벳 역순으로 정렬됩니다.
awk "NR >= $FT_LINE1 && NR <= $FT_LINE2"
- NR → 현재 줄 번호
- $FT_LINE1과 $FT_LINE2는 환경 변수로 지정된 범위
- NR >= $FT_LINE1 && NR <= $FT_LINE2 → 지정된 줄 범위만 남김
- 예: FT_LINE1=3, FT_LINE2=7 → 3~7번째 줄만 선택
tr '\n' ',' tr은 문자 변환(translator), \n → 줄바꿈, , → 쉼표, 즉 줄바꿈을 쉼표로 바꿈
sed 's/,/, /g' 쉼표 뒤에 공백 추가, s/,/, /g → 모든 쉼표를 , 로 바꿈
sed 's/, $/./' 마지막 쉼표와 공백을 마침표로 바꿈, $는 줄 끝(end of line) 의미
tr -d '\n', 마지막 줄바꿈 제거(-d = delete, 출력이 한 줄로 끝나게 합니다.
- /etc/passwd 읽기
- 주석 줄 제거
- 로그인 이름만 추출
- 한 줄 건너서 (짝수 줄) 선택
- 각 로그인 이름 뒤집기
- 알파벳 역순으로 정렬
- 지정 범위만 선택
- 줄바꿈 → 쉼표로 변환
- 쉼표 뒤 공백 추가
- 마지막 쉼표 → 마침표
- 마지막 줄바꿈 제거
문제풀이 :
https://steady-effort-23.tistory.com/33
[라피신 공부 일지] Shell 01
Exercise 01 : print_groups groups $FT_USER | sed 's/ /,/g' | tr -d '\\n' groups를 이용한 코드 Exercise 02 : find_sh find . -type f -name "*.sh" -exec basename {} \\; | sed 's/.sh$//g' find . -type f -name "*.sh" -exec basename {} .sh \\; -> basename
steady-effort-23.tistory.com
https://miingjeong.tistory.com/125
shell_01
ex01 리눅스 명령어 중에 export는 환경 변수 목록을 확인하거나 환경 변수 값을 설정할 수 있어요. 만약 특정 환경 변수 값을 확인하고 싶다면 echo 명령을 사용하세요. ehpub.co.kr/4-%EB%A6%AC%EB%88%85%EC%8A
miingjeong.tistory.com
https://velog.io/@worldicate/Shell01
Shell01
ex01 : print_groups man groupsNAME: groups - print the groups a user is inSYNOPSIS: groups OPTION... USERNAME...which help to bouild the beggining of
velog.io
https://etloveguitar.tistory.com/46
[Linux] tr - 리눅스 명령어 tr에 대해서
리눅스에서 tr은 치환의 의미를 가진다. (번역 아님 주의) 사용 목적 : tr은 지정한 문자를 바꾸거나 삭제하는 명령어다. 문자를 지우거나 바꾸고 싶을 때 주로 사용한다. 기본 명령어 format tr {옵
etloveguitar.tistory.com
FT_NBR1 이 사용하는 문자는 ' \ " ? ! 총 5개
FT_NBR2 이 사용하는 문자도 m r d o c 총 5개
프로그래밍에서 특정 문자들만 사용해서 수를 나타낸다 → 곧 그 문자 집합이 곧 숫자 체계의 자리수(Base) 가 된다.
2개 문자(0,1) → 2진수
10개 문자(0~9) → 10진수
따라서 5진수라고 알 수 있다. 하지만 출력해야 하는 알파벳 집합 "gtaio luSnemf" → 글자가 13개.
따라서 출력은 base 13 으로 변환해야 함.
몇 진수인지 알았으니까 이젠 숫자로 치환해본다.
FT_NBR1 기호 집합 ' "\" ? ! \ → 0,1,2,3,4 로 바꿔야 함.
FT_NBR2 기호 집합 m r d o c → 0,1,2,3,4 로 바꿔야 함.
tr 명령어를 사용하면 간단히 문자 → 숫자 치환 가능
이제 두 수가 base 5임을 알았으니, 실제 계산은 10진수에서 해야 편하다.
bc (리눅스 계산기 도구)를 사용하면 ibase=5 로 설정해서 base 5를 해석할 수 있다.
예: echo "ibase=5; 243" | bc → base 5의 243을 10진수로 변환
bc 안에서 ibase=5 로 읽고, 두 숫자를 그냥 + 연산.
예: echo "ibase=5; 243 + 144" | bc → 10진수로 계산
이제 결과를 base 13으로 표현해야 함
bc는 obase=13 옵션으로 바꾸면 됨
echo "obase=13; ibase=5; <숫자들>" | bc
base 13의 기본 기호는 0123456789ABC
문제에서는 gtaio luSnemf 라는 13글자를 쓰라고 했으니, 다시 문자 변환 필요.
여기서 tr 로 0123456789ABC → gtaio luSnemf 치환.
입력값에서 문자 → 숫자 치환 (base 5 표현 확보).
bc 로 base 5 → base 10 변환.
두 값 더하기.
결과를 base 13으로 변환.
base 13 기호 → 문제에서 요구한 알파벳 집합으로 변환.
echo $FT_NBR1 + $FT_NBR2
예: FT_NBR1과 FT_NBR2는 문제에서 정의한 특수문자(alphabet)로 구성된 문자열입니다.
echo는 두 변수를 "값1 + 값2" 형태로 한 줄로 출력합니다. (플러스 기호로 두 수를 더하는 식을 만들기 위함)
출력 예(가정): \'?" + rcrdmddd
중요: 출력 중에 공백/더하기 기호가 있어야 bc에 "숫자1 + 숫자2" 형식으로 전달됩니다.
연속된 tr들 — 특수문자들을 숫자(0..4) 로 바꾼다파이프라인에 연달아 있는 tr들은 각 문자 → 0..4 로 바꿔서 결국 기수 5의 숫자열을 만들기 위해 사용됩니다.
각 tr의 의미:
tr "\'" "0"
작은따옴표 문자(') → 0tr "\\" "1"
백슬래시(\) → 1
(백슬래시는 셸에서 이스케이프 문자라서 "\\"처럼 두 번 써서 표현합니다)tr "\"" "2"
큰따옴표(") → 2tr "\?" "3"
물음표(?) → 3tr "\!" "4"
느낌표(!) → 4이 다섯 tr은 FT_NBR1 쪽에 쓰이는 문자들(문제에서 정의한 첫 알파벳)을 0..4로 바꿔줍니다.
과적으로 echo의 출력 문자열은 "숫자열 + 숫자열" 형태(단, 숫자들은 0..4만 사용)로 바뀝니다. 예: 1032+14120222 같은 문자열이 됩니다. 이 숫자열은 5진수 표기임을 다음 단계에서 알려줍니다.
주의(쉘/인용): tr에서 "\\"나 \" 같은 것은 쉘에서 적절히 이스케이프해야 하니 실전 입력시 따옴표/백슬래시에 신경 써야 합니다.
xargs echo "obase=13;ibase=5;"
tr까지 거쳐 나온 문자열(예: 1032 + 14120222)을 xargs가 인수로 받아서 echo "obase=13;ibase=5;" ARGUMENTS... 형태로 조합합니다.
이 줄을 bc로 넘기면 bc가 차례로 obase=13;(출력 진법 13 설정), ibase=5;(입력 진법 5 설정), 그리고 1032+14120222(5진수끼리 더하라)를 처리하게 됩니다.
왜 obase를 먼저 설정하나?
bc는 숫자 리터럴(예: 13)을 현재 ibase로 해석하므로 순서에 따라 해석이 달라질 수 있습니다. 일반적으로 안전하게 obase(출력 진법) 먼저 설정한 뒤 ibase(입력 진법)를 바꿔서 그 다음 입력 숫자들이 올바르게 5진수로 해석되도록 합니다.| bc
이제 bc(임의 정밀도 계산기)가 다음을 수행:
obase=13 → 출력 진법을 13진수로 설정
ibase=5 → 이후 등장하는 숫자 리터럴을 5진수로 해석
1032+14120222 → 두 5진수 숫자를 더한 값을 계산
bc는 결과를 설정된 obase(13) 로 출력합니다. 13진수에서 자릿값은 0..9, A, B, C 로 표현됩니다.
예:
만약 bc가 결과로 10A 를 출력했다면 (13진수) 그 문자열이 다음 단계로 전달됩니다.
맨 마지막 tr "0123456789ABC" "gtaio luSnemf"
bc가 출력한 13진수 숫자문자들 (0 1 2 3 4 5 6 7 8 9 A B C)을 문자 알파벳으로 치환합니다.
좌변: "0123456789ABC" (13개 문자)
→ 우변: "gtaio luSnemf" (역시 13문자, 공백 포함)매핑 테이블(인덱스 기준):
0 -> g
1 -> t
2 -> a
3 -> i
4 -> o
5 -> <space> (여기서 공백이 5번째 문자로 들어가 있음)
6 -> l
7 -> u
8 -> S
9 -> n
A -> e
B -> m
C -> f따라서 bc가 내놓은 13진수 숫자열을 이 문자들로 바꿔주면 사람이 읽을 수 있는 단어(문구) 가 됩니다.
예: 7210C → u t g a f (실제 매핑에 맞춰 결과는 다릅니다)예시(간단한 수를 넣어 직접 따라보기)
(이해를 돕기 위한 축약된 예시)
가정: FT_NBR1 = \'?" (문자열 → 문자들: \ \' ? " )
→ tr로 바꾸면: 1 0 3 2 → 5진수 숫열 1032 (base5)FT_NBR2 = rcrd (문자들: r c r d)
→ tr 'mrdoc' 01234 매핑: r->1 c->4 r->1 d->2 → 1412 (base5)bc로 합치면: base5 1032(=142 decimal) + 1412(=232 decimal) = 374 decimal.
374 decimal을 13진수로 바꾸면: 374 /13 = 28 r 10 → 28 /13 = 2 r 2 → (2)(2)(10) ⇒ 22A (13진법 표기)마지막 tr로 22A를 문자로 바꾸면:
2 -> a
2 -> a
A -> e
→ 결과 aae
'라피씬' 카테고리의 다른 글
| 한국어 설정하는 법 (0) | 2025.09.07 |
|---|---|
| 씨 00 (프) (0) | 2025.09.07 |