年后准备的会议材料,一直没用上。本着共享的精神,拿出来晒晒吧。
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