[cmd_test@btjeon-naver ~]$ for i in A B C D; do echo $i; done
A
B
C
D
[cmd_test@btjeon-naver ~]$ for i in {A..D}; do echo $i; done
A
B
C
D
[cmd_test@btjeon-naver ~]$ for i in distros*.txt; do echo $i; done
distros-bydate.txt
distros-dates.txt
distros-key-names.txt
distros-key-vernums.txt
distros-names.txt
distros.txt
distros-vernums.txt
distros-versions.txt
for 문 사용 예
[cmd_test@btjeon-naver ~]$ vi longest_word.sh
--------------------------------------------------------------------------------------------
#!/bin/bash
# longest-word : find longest string in a file
while [[ -n $1 ]]; do
if [[ -r $1 ]]; then
max_word=
max_len=0
for i in $(strings $1); do
len=$(echo $i | wc -c)
if (( len > max_len )); then
max_len=$len
max_word=$i
fi
done
echo "$1: '$max_word' ($max_len characters)"
fi
shift
done
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./longest_word.sh ls-output.txt
ls-output.txt: 'abrt-action-check-oops-for-hw-error' (36 characters)
하나 이상의 파일명이 주어질 때 각 파일 내의 가장 긴 문자열을 검색하는 예제. 각 파일마다 읽을 수 있는 텍스트 단어들의 목록을 생성하기 위해 strings 프로그램을 사용한다.
[cmd_test@btjeon-naver ~]$ vi longest_word2.sh
-------------------------------------------------------------------------------------------
#!/bin/bash
# longest-word2 : find longest string in a file
for i; do
if [[ -r $i ]]; then
max_word=
max_len=0
for j in $(strings $i); do
len=$(echo $j | wc -c)
if (( len > max_len )); then
max_len=$len
max_word=$j
fi
done
echo "$i: '$max_word' ($max_len characters)"
fi
done
-------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./longest_word2.sh ls-output.txt
ls-output.txt: 'abrt-action-check-oops-for-hw-error' (36 characters)
[cmd_test@btjeon-naver ~]$ ./longest_word2.sh distros.txt patchfile.txt
distros.txt: '12/07/2006' (11 characters)
patchfile.txt: '11:25:30.231835775' (19 characters)
for 명령의 words 부분이 생략되면, for는 위치 매개변수를 기본으로 처리한다. shift의 사용도 제거되었다.
[cmd_test@btjeon-naver ~]$ vi simple_counter.sh
--------------------------------------------------------------------------------------------
#!/bin/bash
# simple_counter : demo of C style for command
for (( i=0; i<5; i=i+1)); do
echo $i
done
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ mv smile_counter.sh simple_counter.sh
[cmd_test@btjeon-naver ~]$ ./simple_counter.sh
0
1
2
3
4
for 문의 다른 형식 예제 (C 언어 스타일)
더보기
for 문 활용하여 report_home_space 함수에서 각 사용자 홈 디렉토리에 대한 자세한 정보와 파일 및 하위 디렉토리 정보를 포함하게끔 수정
[cmd_test@btjeon-naver ~]$ vi sys_info_page_here4
----------------------------------------------------------------------------------------------
#!/bin/bash
# sys_info_page: Program to output a system information page
PROGNAME=$(basename $0)
TITLE="System Information Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
report_uptime() {
cat <<- _EOF_
<H2>System Uptime</H2>
<PRE>$(uptime)</PRE>
_EOF_
return
}
report_disk_space() {
cat <<- _EOF_
<H2>Disk Space utilization</H2>
<PRE>$(df -h)</PRE>
_EOF_
return
}
report_home_space() {
local format="%8s%10s%10s\n"
local i dir_list total_files total_dirs total_size user_name
if [[ $(id -u) -eq 0 ]]; then
dir_list=/home/*
user_name="All Users"
else
dir_list=$HOME
user_name=$USER
fi
echo "<H2>Home Space Utilization ($user_name)</H2>"
for i in $dir_list; do
total_files=$(find $i -type f | wc -l)
total_dirs=$(find $i -type d | wc -l)
total_size=$(du -sh $i | cut -f 1)
echo "<H3>$i</H3>"
echo "<PRE>"
printf "$format" "Dirs" "Files" "Size"
printf "$format" "----" "-----" "----"
printf "$format" $total_dirs $total_files $total_size
echo "</PRE>"
done
return
}
usage() {
echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"
return
}
write_html_page() {
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
$(report_uptime)
$(report_disk_space)
$(report_home_space)
</BODY>
</HTML>
_EOF_
return
}
# process command line options
interactive=
filename=
while [[ -n $1 ]]; do
case $1 in
-f | --file) shift
filename=$1
;;
-i | --interactive) interactive=1
;;
-h | --help) usage
exit
;;
*) usage >&2
exit 1
;;
esac
shift
done
# interactive mode
if [[ -n $interactive ]]; then
while true; do
read -p "Enter name of output file: " filename
if [[ -e $filename ]]; then
read -p "'$filename' exists. Overwrite? [y/n/q] > "
case $REPLY in
Y|y) break
;;
Q|q) echo "Program terminated."
exit
;;
*) continue
;;
esac
elif [[ -z $filename ]]; then
continue
else
break
fi
done
fi
# output html page
if [[ -n $filename ]]; then
if touch $filename && [[ -f $filename ]]; then
write_html_page > $filename
else
echo "$PROGNAME: Cannot write file '$filename'" >&2
exit 1
fi
else
write_html_page
fi
----------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here4
<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/16/2022 06:26:02 AM KST, by cmd_test</P>
<H2>System Uptime</H2>
<PRE> 06:26:02 up 32 days, 13:39, 1 user, load average: 0.00, 0.01, 0.05</PRE>
<H2>Disk Space utilization</H2>
<PRE>Filesystem Size Used Avail Use% Mounted on
devtmpfs 481M 0 481M 0% /dev
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 491M 56M 435M 12% /run
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/xvda1 50G 2.4G 48G 5% /
tmpfs 99M 0 99M 0% /run/user/0</PRE>
<H2>Home Space Utilization (cmd_test)</H2>
<H3>/home/cmd_test</H3>
<PRE>
Dirs Files Size
---- ----- ----
216 5363 5.9M
</PRE>
</BODY>
</HTML>
출처 : 리눅스 커맨드라인 완벽 입문서
'IT일반 > Linux' 카테고리의 다른 글
Command Line - 배열 (0) | 2022.06.18 |
---|---|
Command Line - 문자열과 수 (0) | 2022.06.17 |
Command Line - 위치 매개변수 (0) | 2022.06.08 |
Command Line - 흐름 제어 : Case 분기 (0) | 2022.06.07 |
Command Line - 문제 해결 (0) | 2022.06.06 |