现在的位置: 首页 > 综合 > 正文

Shell十三问学习笔记

2013年05月22日 ⁄ 综合 ⁄ 共 2248字 ⁄ 字号 评论关闭

1. echo 命令所支持的反斜线控制字符如下表:
\a:ALERT / BELL (从系统喇叭送出铃声)
\b:BACKSPACE ,也就是向左删除键
\c:取消行末之换行符号
\E:ESCAPE,跳脱键
\f:FORMFEED,换页字符
\n:NEWLINE,换行字符
\r:RETURN,回车键
\t:TAB,表格跳位键
\v:VERTICAL TAB,垂直表格跳位键
\n:ASCII 八进位编码(以 x 开首为十六进制)
\\:反斜线本身

2. 常用meta
IFS:由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。
CR: 由 <enter> 产生。

3. 除了IFS与CR,常用的meta还有:
=  :设定变量。
$  :作变量或运算替换(请不要与 shell prompt 搞混了)。
>  :重导向stdout。
<  :重导向stdin。
|  :命令管道。
&  :重导向file descriptor,或将命令置于后台执行。
() :将其内的命令置于nested subshell执行,或用于运算或命令替换。
{} :将其内的命令置于non-named function中执行,或用在变量替换的界定范围。
;  :在前一个命令结束时,而忽略其返回值,继续执行下一个命令。
&& :在前一个命令结束时,若返回值为true,继续执行下一个命令。
|| :在前一个命令结束时,若返回值为false,继续执行下一个命令。
!  :执行history列表中的命令

4. quoting的三种方法
hard quote:' '(单引号),凡在hard quote中的所有meta均被关闭。
soft quote:“”(双引号),在soft quote中大部份 meta 都会被关闭,但某些则保留(如$)。
escape:\(反斜线),只有紧接在escape(跳脱字符)之后的单一meta才被关闭。

4.1 示例1
[test@rhel5 ~]$ A="B C"
[test@rhel5 ~]$ echo "'$A'"
'B C'
[test@rhel5 ~]$ echo '"$A"'
"$A"

[test@rhel5 ~]$ A=B\ C
[test@rhel5 ~]$ echo "'$A'"
'B C'
[test@rhel5 ~]$ echo '"$A"'
"$A"

4.2 示例2
[test@rhel5 ~]$ A="
> B
> C"
[test@rhel5 ~]$ echo $A
B C
[test@rhel5 ~]$ echo "$A"

B
C

# $A 时的变量没至于 soft quote 中,因此当变量替换完成后并作命令行重组时,<enter> 会被解释为 IFS ,而不是解释为 New Line 字符。

5. ()与{}这两对符号的差异
()将command group置于sub-shell去执行,也称nested sub-shell。
{}则是在同一个shell内完成,也称为non-named command group。
所谓function,就是用一个名字去命名一个command group,然后再调用这个名字去执行command group。

6. $(( ))与$( )还有${ }的区别
$( )与` `(反引号)都是用来做命令替换用(command substitution)的。在多层次的复合替换中,``须要额外的跳脱(\`)处理,而$()则比较直观。
${ }是用来作变量替换用的。
$(( ))用来作整数运算的。

7. ${ }的一些特异功能
详见"shell中${}的妙用 "

8. $$, $#, $@, $*区别?
$$: 进程ID
$#: 参数的数量
$?: 上一条命令的返回值

my.sh p1 "p2 p3" p4
"$@" 则可得到 "p1" "p2 p3" "p4" 这三个不同的词段(word)﹔
"$*" 则可得到 "p1 p2 p3 p4" 这一整串单一的词段。

9. 命令的返回值
Return Value的作用,是用来判断行程的退出状态(exit status),只有两种:
0的话为"真"(true)
非0的话为"假"(false)

10. &&和||
&& 与 || 都是用来"组建"多个 command line 用的:
command1 && command2:其意思是command2只有在RV为0(true)的条件下执行。
command1 || command2:其意思是command2只有在RV为非0(false)的条件下执行。

11. < 和 >
标准输出: 1>
错误输出: 2>
两个输出合并: 1>file.both 2>&1
输出到空设备: &>/dev/null

12. 管道pipe
上一个命令的stdout接到下一个命令的stdin

13. if与case

if comd1; then
  comd2
elif comd3; then
  comd4
else
  comd5
fi

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    rhstatus
    ;;
  restart|reload)
    restart
    ;;
  condrestart)
    [ -f /var/lock/subsys/syslog ] && restart || :
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart}"
    exit 1
esac

13. for, while, until

for var; do
  ......
done

for var in one two three four five
do
  echo '$var is '$var
done

for ((i=1;i<=10;i++))
do
  echo "num is $i"
done

num=1
while [ "$num" -le 10 ]; do
  echo "num is $num"
  num=$(($num + 1))
done

【上篇】
【下篇】

抱歉!评论已关闭.