不一样的思想~~ http://shop34712791.taobao.com MSN:wins0910@hotmail.com

shell新学

上一篇 / 下一篇  2007-10-01 21:42:05 / 个人分类:shell

备用:

内容:SHELL的最新技术内容
1。
ln命令最初的设想是实现定时备份,所以不使用任何参数的链接,修改一个另外一个会变化,删除一个另外一个不会被删除。
ln -s 命令最初是用来实现跨文件系统的链接,所以符号链接在源文件删除后,符号链接就不能再使用了

2。
${filename}X 可以避免 $filenameX 理解为一个变量,当然也可以使用 $filename'X'来避免

3。
算数扩展格式:$(( a=a+1 )),全部采用C语言的语法
格式: $(( )) 不能有空格,但是双括号内的空格可以随便,双括号内的变量不用 $ 符号,这是最新标准,可能有些老的shell不支持

4。
单引号和双引号的区别
'*' 和 * 相同,但是"*" 不再代表所有内容,而代表一个星号
'$var'不会解释变量,认为就是字符串$var, $var 里面如果有回车,它会自动去掉,但是 "$var" 中如果有回车就不会去掉
echo a b    c     d  返回会将多个空格缩成一个空格; echo 'a b    c     d' 而返回会保留空格

5。
匹配精确数目的字符串:a\{4,7\} ,意思是匹配4 到7 个 a

6。
保存匹配的字符串:^\(.\).*\1$ 它的意思是\(.\)将开头的第一个字符取出来,放进寄存器\1中,这样整句话就是说匹配第一个字符和最后一个字符相同的串

7。
反斜杠用来续行,例如:
$lines=one\
two

8。
命令替换:可以不使用`pwd`,改用$(pwd)
优点:
a。不容易和单引号混淆
b。嵌套时比较好看

9。
如果程序需要传递9个以上的参数,不能用$10,$11,而需要写成${n}

10。
test $name = lanh 和 test "$name" = lanh 的区别,如果$name 不为空的情况下是一样的,如果它为空,那么推荐后者,因为此时前者就相当于输入了:test = lanh 错误提示:argument expected,而后者还能够正常判断

但有时这个特性可作特定用途,例如:
test $name = lanh , 而 $name 等于 'lanh    '有空格,如果使用"$name", 那就不相等,因为有空格,但不用双引号就会相等,因为它自动吃掉了空格。不过个人觉得还不如写 :test "$name" = "lanh        ",明确有空格

11。
在条件判断方括号中,小括号需要转义符,例如:[ \( "$count" -ge 0 \) -a \( "$count" -lt 10 \) ]

12。
sh -x shell.sh para , 可以打印出很多调试信息

13.
export -p 导出的所有变量的清单

14。
. file 相当于 sh file , 这样可以保留住 file 中定义变量的值,否则如果./file ,这只是在一个子shell中执行了这个程序,修改的变量的值存放到了子shell中

15。
(x=100) 和 {x=100}的不同,前者是在子shell中运行的,后者在当前shell中运行。故前者执行后在当前的shell中并没有x 变量,而后者执行后有 x

16。可以在shell 命令提示符下直接执行
估计没有设置就是没有定义,也就是没有:var= ,为空就是var='',自己猜的
${parameter:-value} : 如果 parameter 为空,则用value替代,不为空则不替代,但是并不给变量赋值
${parameter-value} : 如果 parameter 没有设置,则用value替代,不为空则不替代,但是并不给变量赋值
${parameter:=value} : 如果 parameter 为空,则用value替代,不为空则不替代,并且给变量赋值
${parameter=value} : 如果 parameter 没有设置,则用value替代,不为空则不替代,并且给变量赋值
${parameter:?value} : 如果 parameter 为空,写入标准错误,不为空就替代它的值
${parameter?value} : 如果 parameter 没有设置,写入标准错误,不为空就替代它的值
可以用来检查变量是否为空
${parameter:+value} : 如果 parameter 为空,什么都不做,如果不为空,就替代它的值
${parameter+value} : 如果 parameter 没有设置,什么都不做,如果不为空,就替代它的值


17。都不修改变量
${variable%pattern} : 看是否以给定的模式结尾,如果是,就从右边去掉最短的匹配模式(非贪婪匹配,perl中使用问号)
${variable%%pattern} : 看是否以给定的模式结尾,如果是,就从右边去掉最长的匹配模式(贪婪匹配)
${variable#pattern} : 看是否以给定的模式开头,如果是,就从左边去掉最短的匹配模式(非贪婪匹配)
${variable##pattern} : 看是否以给定的模式开头,如果是,就从左边去掉最长的匹配模式(贪婪匹配)


例如:检查一个变量是否以某个字符串结束
if [ ${file%.o} != $file ]   判断变量file的值是否以.o结束

18。得到文件名
a. echo '/export/home/uptel/neva2p' |awk -F/ '{print $NF}'
b. echo '/export/home/uptel/neva2p' |echo ${1##*/} 没有试验成功

19。设置shell跟踪模式
a. sh -x ctype a
b. x=* ; set -x

20。
set -- -5 + 1 = 4  让5前的减号不被解释成参数开头

21。
IFS=:
影响read,read x y z ; 123:3:8

22。得到八进制的值
echo "$IFS" | od -b

23。eval 两遍扫描
pipe="|" ; ls $pipe wc -l  出错:提示没有文件 | , wc , -l
此时需要用 pipe="|" ; eval ls $pipe wc -l

24。
wait : 等待当前作业完成
wait 3243 :加上进程ID
$! 代表最后一个送到后台的进程标识
例如:
prog1 &
pid1=$!
prog2 &
pid2=$!

wait &pid1

wait &pid2

25。
trap commands signals : 代表什么信号发生,就执行命令
如果执行空命令,就是忽略掉信号,trap "" 2
如果恢复缺省,trap 2

26。
cat <<-END : 输入遇到END 就结束,-代表去掉行首缩进

27。
exit 会退出整个shell
return 只退出函数

28。
行首指定命令解释:
#!/usr/bin/bash
#!/usr/bin/ksh

29。
bash 和 korn shell 支持算术表达式,但无美元符号,且不能变量赋值或冒号操作符

30。
数组:
${array[i]}  : 元素i的值
$array : 第一个元素的值
${array[*]} : 替换所有元素的值
${#array[*]} : 元素的个数
array[i]=val ; 赋值

31。
jobs   :显示所有任务
kill %1 :删除任务

32。
- : 回到上一目录
~ : 回到$HOME
~user : 到user 用户的目录


相关阅读:

TAG: shell

“ 纳兰*陨” 的个人空间 引用 删除 jone123   /   2012-03-13 12:52:05
1
 

评分:0

我来说两句

Open Toolbar