Hi, 如果有任何想法与我沟通, 请用: lifr_nj 在 msn.com

bash learning

上一篇 / 下一篇  2007-12-19 09:43:39 / 个人分类:other

这两天读了 Advanced Bash scrīpt Guide和shell 十三问。有一些有意思但以前自己不懂或混淆的东西。记下来如下。


*) local,在函数内部定义有限作用域的变量
> function foo { A=aaa; echo $A;  }
> A=bbb; echo $A; foo; echo $A
bbb
aaa
aaa

> function bar { local A=aaa; echo $A; }
> A=bbb; echo $A; foo; echo $A
bbb
abc
bbb

*) {} and ()
{} like a anonymous function
() commands in () will be executed in subshell
> A=aaa; { A=bbb; }; echo $A
bbb
> A=aaa; ( A=bbb; ); echo $A
aaa

*) (())和let,整数计算
> a=1
> ((b=a+1))
> echo $b
2

*) 子进程与父进程的变量访问
    1)子进程可以 看到 父进程的变量,因为它有父进程变量的copy
    2)子进程不可以 访问 父进程的变量
    3)如果要让 子进程 可以访问父进程的变量,那么父进程要export该变量
    3)父进程既看不到也不可以访问 子进程的变量。

*) source(或 .) 会在当前进程里执行,就象在命令行输入的一样

*) 管道会以子进程来运行

*) "-"可以替代 “标准输出”或标准输入“
它在管道中特别有用,可以避免管道broken,比如
> echo "xxx" | cat -

注意,"-"是由应用程序解释的(这里是cat),而不是bash

*) 退出码
0表示true,其他都为false


*) CTRL 命令
ctrl+c terminate a foreground job
ctrl+z pause a foreground job

ctrl+d 1) log out. similar to 'exit', 2) EOF, used in inputing HERE doc
ctrl+g bell beep
ctrl+l clear scree. similar to 'clear'
ctrl+s freeze STDIN
ctrl+q resume STDIN
ctrl+u erase a line of input, from cursor to begin point


*) 对${}的扩展
一般来说${varName}是对变量的引用,但bash在此基础上提供了一些对字符串处理的扩展。

替换
1) ${varName/src/dst}是对变量字符串的替换,把第一个src用dst来替换
2) ${varName//src/dst}是对变量字符串的替换,把所有src用dst来替换

子串
${varName:pos}
${varName:pos:len}

${#varName} 取得字符串长度


*) echo的参数
-n 不要换行
-e 可以使用'\'转义
    \a      bell beep
    \n      new line
    \t      tab
    \123    octal
    \x123   hex

 


TAG: shell other

 

评分:0

我来说两句

Open Toolbar