Linux Shell学习(4)

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 (用以捕捉信号)

 

 

 

 

 


 

你可能感兴趣的:(Linux Shell学习(4))