Linux Shell学习笔记
# 注释,或者脚本第一行的#!/bin/bash
; 命令分隔符,可以用来在一行中来写多条命令
;; 终止case 例如:
case "$variable" in
abc) echo "\$variable=abc" ;;
xyz) echo "\$variable=xyz" ;;
esac
" 部分引用
' 全部引用
\ 转义
, 分隔算术操作,只有最后一项被返回
let "t2=((a=9,15/3))"
#set "a=9" and "t2=15/3"
` 后置引用,命令替换
: 空命令,等价于"NOP",起到true的作用
如:
:
echo $? #0
死循环:
while:
do
...
done
在if/then中的占位符,如:
if condition
then :
else
take-some-action
fi
在一个2元命令中提供占位符:
:${username='whoami'}
使用“参数替换”来评估字符串变量
:${HOSTNAME?}${USER?}${MAIL?}
#如果一个或多个必要的环境变量没被设置,就会打印出错信息
:>data.txt #文件data.txt被清空
":"用来做环境变量的分隔符
echo $PATH
/usr/local/bin:/usr/x11r6/bin:/sbin
* 匹配文件名中的任意字符,数学运算中的乘
** 幂运算
! 取反
? 测试操做
$ 变量替换
$ 正则表达式的结束符
${} 参数替换
$*,$@ 位置参数
$? 退出状态,0为成功,非0为失败
$$ 进程ID变量,脚本的进程ID
() 命令组,子shell。子shell中的变量对于脚本剩下的部分不可用,例如:
a=123
(a=321;)
echo "a=$a" #a=123
初始化数组:
Array=(element1,element2,element3)
{aaa,bbb,xxx...}
大括号扩展,其中不能有空格,
cat {file1,file2,file3}>combined_file
#将file1,file2,file3
{} 代码块:创建了一个匿名函数,但与函数不同的是,在其中声明的变量对于脚本的其他部分还是可见的
a=123
{a=321;}
echo "a=$a" #a=321
与()不同,{}中的代码块将不能正常地开启一个新的shell
[] test表达式
if [ -z "$1" ] 判断第1个参数是否为空
if [ "$?" -eq 0 ] 判断上一条语句是否成功
if [ -n "$2" ] 判断第2个参数是否为整型
......
[] 数组元素:
Arrary[1]=slot_1
echo ${Array[1]}
>,>>,<<,< 重定向
scriptname>filename 重定向脚本输出到文件中,并覆盖原有文件
command&>filename 重定向stdout和stderr到文件中
command>&2 重定向stdout到stderr中 ,1为stdout,2为stderr
scriptname>>filename 重定向到脚本输出到文件中,并添加到文件末尾
<,> ASCII比较
\<,\> 正则表达式中的单词边界
grep '\<the\>' textfile
| 管道,用来产生命令链
cat *.lst | sort | uniq
#合并和排序所有的"*.lst"文件,然后删除所有重复的行
管道中的一个进程的stdout必须被下一个进程做为stdin读入,如果管道中的某个命令产生一个异常,并中途失败,那么这个管道将过早的终止,这种行为被叫做“a broken pipe”,并且这种状态下将发送一个SEGPIPE信号
>| 强制重定向
|| 或逻辑
& 后台执行
&& 与逻辑
- 之前的工作目录
cd - #进入到上一个工作目录
与$OLDPWD的环境变量相同
~ home目录
~+ 当前的工作目录,与$PWD相同
~- 之前的工作目录,相当与$OLDPWD
^ 正则表达式中的表示行首
例子来源于《高级Bash脚本编程指南》下载见http://www.linuxidc.net/thread-2055-1-1.html