Shell十三问学习笔记
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才被关闭。
[sql]
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
[sql]
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
[sql]
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