linuxshell 读书笔记六 (unix shell 第三版)

--打开跟踪 相当于 sh -x  但不跟踪子shell
[xep@localhost ~]$ set -x
++ echo -ne '\033]0;xep@localhost:~'

[xep@localhost ~]$ pwd
+ pwd
/home/xep
++ echo -ne '\033]0;xep@localhost:~'

--关闭跟踪
[xep@localhost ~]$ set +x
+ set +x

--set 后面跟的字符 会存入相应该的参数中 如下
[xep@localhost ~]$ set f1 s1 5
[xep@localhost ~]$ echo $1,$2,$3
f1,s1,5
[xep@localhost ~]$ echo $#
3
[xep@localhost ~]$ echo $*
f1 s1 5
[xep@localhost ~]$ echo $@
f1 s1 5

--set 遇到-(减号)认为是参数 所以把所有的参数都列了出来
[xep@localhost ~]$ set -1
-bash: set: -1: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]

--用两个--(减号)来解决赋值的问题
[xep@localhost ~]$ set -- -1 -2 3
[xep@localhost ~]$ echo $1,$2,$3
-1,-2,3

--IFS (internal field seperator) 内部字段分隔符
[xep@localhost ~]$ echo ":$IFS:"
:
:
--转换成八进制显示
[xep@localhost ~]$ echo "$IFS"|od -d
0000000  2336  2570
0000004

[xep@localhost ~]$ TIFS=$IFS           --备份ifs
[xep@localhost ~]$ IFS=":"                  --修改
[xep@localhost ~]$ read line             --读取
123:456:678
[xep@localhost ~]$ echo $line            
123 456 678
[xep@localhost ~]$ read p1 p2 p3         
123:456:567
[xep@localhost ~]$ echo $p1,$p2,$p3      --已应用到各变量中
123,456,567
[xep@localhost ~]$ IFS=$TIFS                    --改回
[xep@localhost ~]$ read p1 p2 p3
123:456:567
[xep@localhost ~]$ echo $p1,$p2,$p3      --接受默认的空格分隔
123:456:567,,


--readonly变量
[xep@localhost ~]$ readonly test=123
[xep@localhost ~]$ test=456
-bash: test: readonly variable

readonly -p                              --显示只读变量

--用unset可以删除导出变量 和 局部变量 但对只读变量不起作用

[xep@localhost ~]$ TIFS=$IFS
[xep@localhost ~]$ unset TIFS
[xep@localhost ~]$ echo $TIFS

[xep@localhost ~]$ unset test
-bash: unset: test: cannot unset: readonly variable

eval使shell在执行命令时候扫描它两次
[xep@localhost ~]$ pipe="|"
[xep@localhost ~]$ ls $pipe wc -l
ls: |: No such file or directory
ls: wc: No such file or directory
[xep@localhost ~]$ pipe=`|`
-bash: command substitution: line 1: syntax error near unexpected token `|'
-bash: command substitution: line 1: `|'
[xep@localhost ~]$ eval ls $pipe wc -l
ls: wc: No such file or directory
[xep@localhost ~]$ echo $pipe

[xep@localhost ~]$ pipe="|"
[xep@localhost ~]$ echo $pipe
|
[xep@localhost ~]$ eval ls $pipe wc -l
41

--eval第一次扫描,把变量pipe的值替换成|,接着eval使它再次执行时候就能顺利执行

[xep@localhost ~]$ cat -n showlastp_script
     1  #! /bin/bash
     2  #  show last parameter
     3
     4  eval echo \$$#
[xep@localhost ~]$ ./showlastp_script 41 53 67 99
99

--说明:第一次把$#转换成了参数的个数 第二执行时 就变成了 echo $4


--这个例子不太好理解了    好好研究下吧
[xep@localhost ~]$ cat -n point_script
     1  #! /bin/bash
     2  #  use eval  like point
     3
     4  x=100
     5  ptrx=x                        --ptrx中存的是x  
     6  eval echo \$$ptrx    --将$ptrx 转换成 x
     7
     8  eval $ptrx=50          --将$ptrx转换为x
     9  echo $x
[xep@localhost ~]$ ./point_script
100
50

--wait process_id  等待process_id执行完 再执行
[xep@localhost ~]$ sort intro > intro_bak &
[1] 28321

[xep@localhost ~]$ date
Sun Oct 30 21:39:13 CST 2011
[xep@localhost ~]$ wait 28321

--如果wait 不带参数 则等待所有的子进程完成

--用$!保存最后一个后台运行进程的process_ID
[xep@localhost ~]$ sort intro &
[1] 28341

[xep@localhost ~]$ pro1=$!
[xep@localhost ~]$ echo $pro1
28341
[xep@localhost ~]$ sort intro &
[1] 28347

[xep@localhost ~]$ pro2=$!
[xep@localhost ~]$ echo $pro2
28347

[xep@localhost ~]$ wait 28347
...
...
[xep@localhost ~]$ wait &pro1



你可能感兴趣的:(linuxshell 读书笔记六 (unix shell 第三版))