1. for loop
for var in item1 item2 ... itemN
do
done
for var in list-of-values
do
done
for var in file1 file2 ... fileN
do
done
for var in $filename
do
done
for var in $(command-in-linux)
do
done
for var in ${arrayname[@]}
do
done
for ((exp1;exp2;exp3))
do
done
2. command substitution
a shell command output stored in a string or a variable
$(...)
`command`
3. e.g. --- print out a chess board
#!/bin/bash
###print out a chess board
for ((i=1; i<=8; i++)); do
for ((j=1; j<=8; j++)); do
total=$(($i+$j))
tmp=$((total%2))
if [ $tmp -eq 0 ]; then
echo -e -n "\033[47m \033[0m"
else
echo -e -n "\033[40m \033[0m"
fi
done
echo ""
done
4. while loop
while
do
done
eg
while [ $n -le 5 ]
do
...
done
while (($n <= 5))
do
...
done
5. 无限循环(infinite loop)
while :
do
done
while true
do
done
6. until toop
until [ condition ]
do
done
7. select loop
root@localhost :/home/James/mypro/shell# select var in $list; do echo $var; done
1) option1
2) option2
3) option3
#? 2
option2
#?
8. break和break N,continue
跳出循环;跳出N重循环;继续下次迭代
9. create empty file
touch newfile
> newfile
10. 利用/dev/null忽略不想要的输出
command > /dev/null
command 2>/dev/null (注意2和>之间不能有空格)
command &>/dev/null
command >/dev/null 2>&1
11. Redirection
command < inputfile > outputfile
12. User defined file descriptor
exec fd> filename
command >&fd (>和&间布恩那个有空格)
exec fd<filename
command <&fd
exec fd<&- (关闭该文件描述符)
exec fd<>filename (read and write)
13. 得到目前进程的pid
$$
root@localhost :/home/James/mypro/shell# ls -l /proc/$$/fd
总用量 0
lrwx------ 1 root root 64 2012-05-12 10:54 0 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 1 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 2 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 255 -> /dev/pts/2
lr-x------ 1 root root 64 2012-05-12 10:54 3 -> /home/James/mypro/shell/output
root@localhost :/home/James/mypro/shell# exec 3<&-
root@localhost :/home/James/mypro/shell# ls -l /proc/$$/fd
总用量 0
lrwx------ 1 root root 64 2012-05-12 10:54 0 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 1 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 2 -> /dev/pts/2
lrwx------ 1 root root 64 2012-05-12 10:54 255 -> /dev/pts/2
14. pipes
command1 | command2
command1 | command2 | commandN
command1 arg1 | command2 arg1 arg2
get_data_command | verify_data_command | process_data_command |
format_data_command > output.data.file
get_data_command < input.data.file | verify_data_command |
process_data_command | format_data_command > output.data.file
(评论:Linux的IPC pipe机制和shell相结合,其威力绝对是1+1 > 2的。
实际上command1 | command2是将command1的输出重定向到管道write端,将command2的输入重定向到管道read端,然后利用管道进行数据传输。我可以猜测到,其实现大概会是这样的:
主进程关闭标准输入输出,创建一个pipe[2],然后fork出两个子进程,command1子进程重新关闭pipe的输入端,重新打开stdin,command2子进程不安比pipe的输出端,重新打开stdout.
这里有个很重要的小技巧,进程一定会把0当成标准输入,把1当成标准输出。可以参考Beginning Linux Programming中关于pipe IPC机制的讲述,其中有个例子就是在不改变原来程序的基础
上,利用主程序+pipe+重定向+fork+exec的技巧,实现了主程序可以对子程序进行输入和输出控制。这就相当于可以和现有的程序通讯了,而他们之间不用特殊的约定。注:其实是有的,就
是程序认为0是输入,1是输出。)
pipe的作用:
=> 避免创建临时文件。
=> 进行数据过滤。(fiter out data)
15. 显示系统支持的信号
root@localhost :/home/James/proto3-247# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
kill -9 pid <==> kill -KILL pid <==> kill -SIGKILL pid
killall -s SIGKILL prog-name
16. trap (用以捕捉信号)