年后准备的会议材料,一直没用上。本着共享的精神,拿出来晒晒吧。
Linux Shell ABC
0. 关于shell
0.1 常见的shell
---------------------------------------------
shell path name
---------------------------------------------
rc /usr/bin/rc rc
Bourne shell /usr/bin/sh sh
C shell /usr/bin/csh csh
Bourne Again shell /bin/bash bash
Z shell /usr/local/bin/zsh zsh
Korn shell /usr/bin/ksh ksh
TC shell /usr/bin/tcshell tcsh
0.2 shell的启动、更改和退出
更换shell:
输入相应的命令可更改
退出:
- 输入exit后按
- 在空行上键入< ^D>
0.3 shell环境变量
可通过set命令查看,常见的有:
HOME
HOSTNAME
LANG
LC_CTYPE
MAIL
PS1
PATH
PWD
SHELL
TERM
UID
MAIL
0.4 shell元字符
--------------------------------------------------------------
元字符 作用 举例
--------------------------------------------------------------
New Line 结束命令行
Space 分隔命令行中的元素
Tab 分隔命令行中的元素
# 注释
" 引用多字符,允许替换
$ 结束一行;间接引用shell变量 uid:"$UID"
& 让命令到后台执行 command &
' 引用多字符 '$UID'
( ) 执行子shell中的命令列表
* 匹配0个或多个字符 ls /etc/p*sswd
[ ] 插入通配符 ls /etc/rc[0-6].d
^ 开始一行以及否定符号
` 命令替换 NAME=`echo zgq`
{ } 在当前shell中执行命令列表
| 创建命令之间的管道 ls | wc -l
; 顺序执行命令 date; sleep 1; date
> 命令的重定向输出 echo > /tmp/test.txt
< 命令的重定向输入 wc -l < /tmp/test.txt
? 通配符为单个字符 ls /etc/pass??
/ 路径分隔符
\ 转义字符
! 启动历史列表中指定的事件以及当前事件 !vi
~ home目录 echo ~
0.5 Bash相关配置文件
/etc/profile
登录时的系统初始化文件
~/.bash_profile
登录时用户专有的初始化文件
~/.bashrc
登录以及每打开一个交互shell,用户专有的初始化文件
~/.bash_logout
用户退出时执行的文件
~/.inputrc
Individual readline initialization file
1.运行Shell脚本
- 增加文件可执行权限
$ chmod +x script_file
- 直接通过shell命令执行
$ /bin/sh script_file
$ /bin/bash script_file
- 脚本文件开头指定shell
#!/bin/bash
2. Shell变量及其相关命令
- 可写环境变量
- 只读环境变量
环境变量 含义
$0 程序名
$1 - $9 第1-9个命令行参数的值
$* 所有命令行参数的值
$@ 所有命令行参数的值(如果它被包含在引号中,如"$@",
则每个参数也将各自被包含在引号中)
$# 命令行参数的总数
$$ 当前的进程ID(PID)
$? 上一条命令的退出状态(0 - 成功,其他输出 - 失败)
$! 最近后台进程(在后台运行的最后一个进程)的进程ID
- 相关命令
- set
- env(不如set命令完整)
2.1 读写shell变量
variable1=value1 [variable2=value2 ... variableN=valueN]
注意:
- 等号(=)前后没有空格,如果值中含有空格,须使用引号将这个值括起。
- 多个赋值语句可写在一行,但必须用空格或分号分隔
$ name=Guoqiang
$ echo $name
Guoqiang
$ name='Zhou Guoqiang'
$ echo $name
Zhou Guoqiang
$ my_uid='$UID'
$ echo $my_uid
$UID
$ my_uid="$UID"
$ echo $my_uid
1000
2.2 命令替换
`command`
$ echo now: `date`
now: Sun Mar 23 17:44:36 CST 2008
$ now="date: `date`"
$ echo $now
date: Sun Mar 23 17:45:45 CST 2008
$ now='date: `date`'
$ echo $now
date: `date`
2.3 导出环境变量
命令export可以向后继shell进程传递变量的值
export [name-list]
2.4 重置变量
unset [name-list]
2.5 创建只读用户自定义变量
readonly [name-list]
类似PHP中的常量
$ name=zgq gender=male
$ readonly name gender
$ echo $name $gender
zgq male
$ name=zhang3 gender=female
bash: name: readonly variable
2.6 读取标准输入
read variable-list
3. 脚本参数传递
- 9个参数($1 - $9)有时不够用
可以使用shift命令将参数左移N个位置
shift [N]
- set [options] [argument-list]
依次将各位置参数的值设为argument-list中指定的参数
如果不带任何参数,set将显示所有shell变量以及他们当前的值
4. 注释与程序头
#!/bin/bash
#
#
#
5. 程序控制
1. if-then-elif-else-fi语句
if expiression
then
elif expression
then
...
else
...
fi
- expression可以使用test命令也可以使用括号
if test $# -eq 0
等价为:
if [ $# -eq 0 ]
(注意[和]前后的空格)
2. for语句
for variable [in argument-list]
do
command-list
done
如果没有提供argument-list,参数由命令行提供
3. while语句
while expression
do
command-list
done
如果死循环,就<^C>吧
4. until语句
until expiression
do
command-list
done
5. break和continue命令
6. case语句
case test-string in
pattern1)
command-list1
;;
pattern2)
command-list2
;;
patternN)
command-listN
;;
*)
end-command-list
;;
esac
6. 常用命令集锦
- 杀死firefox进程
$ ps aux | grep firefox | grep -v grep |cut -c 9-15 |xargs kill -9
- 将当前目录下php文件中的foo题换成bar
$ sed *php -in-place -e's/foo/bar/g'
- 根据ip查看bbs.insenz.com的访问次数
$ cat bbs.insenz.com-access_log | awk '{print $1}' | sort | uniq -c | sort -nr
- 查看远程服务器的磁盘空间状况
$ ssh zhouguoqiang@10.0.1.33 'df -h'
- 查看svn副本中某两个目录下的代码总行数
$ find src/ tests/ -type f | grep -v .svn | xargs wc -l | awk '{ sum += $1; } END { print sum; }'
6. 参考资料
- Unix教程(第二版)
http://www.douban.com/subject/1809210/
- man bash, man test