Chapter 1 如何才能学好shell编程 1.0多写、多写;每个代码都要写 Chapter 2 Shell脚本 2.1 什么是shell? 2.2 什么是shell脚本? 2.3 shell脚本的地位 2.4 shell脚本的种类 B shell(bash、sh)、C shell 2.5 常用的操作系统默认的shell [root@bogon ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin [root@bogon ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash 2.6 shell脚本的执行 执行顺序:查找ENV(/etc/profile .bash_profile .bashrc /etc/bashrc)加载环境变量;执行shell脚本内容 执行方式:sh ***.sh ./***.sh cat ***.sh | sh 基本规范:写解释器 写info 写注释 书写习惯:成对符号要一次性写出 中括号两端要留有空格 流程控制语句要写完 代码要缩进 引号使用:常规变量要双引号 a="/tmp/srm" 强引用(所见即所得)的要用单引号 echo 'qwejklsdmkasjasdj' 命令引用要用反引号`whoami` Chapter 3 shell变量 3.1什么是变量 不区分类型 分局部变量和全局变量 3.2环境变量 显示变量的值:set(所有变量) env(全局变量) declare(变量、函数等) 自定义环境变量:export a="123"或者declare -x a="1234" [root@localhost ~]# export a="123" [root@localhost ~]# echo $a 123 [root@localhost ~]# declare -x a="1234" [root@localhost ~]# echo $a 1234 取消环境变量:unset 如何永久生效:写入环境变量 1.用户环境变量配置文件 /root/.bashrc /root/.bash_profile 2.全局环境配置变量/etc/profile,/etc/bashrc,/etc/profile.d/ 显示环境变量?echo $a 3.3普通变量 3.3.1定义本地变量 将命令的结果作为变量的内容进行赋值··(反引号)或者$() 字符串拼接:直接拼接即可。tar -zcvf `uname -n`_$DATE.tar.gz /Storage/Plus/webapp/storage 3.3.2和awk、sed、grep配合使用 对sed、grep支持较好;awk不太好 Chapter 4 shell变量知识进阶与实践 4.1特殊且重要的变量 $0 shell脚本的执行路径+ $n 第n个参数,如果大于9,需要用{}引用,如${10} $# 获取脚本传参的总个数 $* 获取后边的参数,加双引号代表“$1 $2 $3” $@ 获取后边的参数,加双引号代表“$1” "$2" “$3” $? 上一个状态的返回值 $$ 当前shell脚本的PID $! 上一个在后台进程的PID $_ 获取上一个命令或脚本的最后一个参数 [root@localhost ~]# sh /root/rpcbind.sh start 12ew 123 start /root/rpcbind.sh $0 3 $# start 12ew 123 $* start 12ew 123 $@ 4.2内置命令 echo eval 当shell执行到eval语句时候,shell读入参数args,并将它们组合为一个新的命令并执行 exec 在当前shell执行命令,执行完毕后该shell终止 read 读取用户输入 4.3shell变量字符串知识 ${parameter} 字符串内容 ${#parameter} 字符串长度 wc -L / awk带的length函数、expr带的length函数 ${parameter:offset} 从位置offset之后开始提取子串到结尾 [root@bogon ~]# a=asdadadasdad [root@bogon ~]# echo ${a:1} ##sdadadasdad ${parameter:offset:length} 从位置offset之后开始提取长度为length的子串 [root@bogon ~]# echo ${a:1:2} sd ${parameter#word} 从头开始删除最短匹配字符串 ${parameter##word} 从头开始删除最长匹配字符串 ${parameter%word} 从尾开始删除最短匹配字符串 ${parameter%%word} 从尾开始删除最长匹配字符串 [root@bogon ~]# echo ${a#a*d} adadasdad ${parameter/pattern/string} 使用string替换第一个匹配的string ${parameter//pattern/string} 替换所有 计算长度的示例 ARRAY=( i am oldboy linux , welcome to our training classroom ) ##shell数组的方法 for ((i=0;i<${#array[*]};i++)); do if [ ${#array[$i]} -lt 6 ]; then echo "${array[$i]}" fi done echo "-----------------------------------" ##遍历数组的两种方法 for word in ${array[*]} do if [ `echo $word | wc -L` -lt 6 ];then echo $word fi done ##for循环实现和第二种遍历数组方法差不多?! for i in i am oldboy linux,welcome to our training classroom; do if [[ `echo $i|wc -L ` -lt 6 ]]; then echo $i fi done ##awk的方法 也是写for循环进行遍历,和C的方法一样 echo $ARRAY | awk 'BEGIN{}{for(i=1;i<=NF;i++) if(length($i)<6) print $i}END{}'