1、编程语言有两类:静态语言(编译型语言,如c、c++、java等);动态语言(解释型语言,如shell、pytho、shell、perl)。静态语言是强类型的语言需要编译在运行(需要编译器),而动态语言是弱类型的语言需要解释执行(需要解释器)。shell分类很多各个unix、linux系统上的都有不同的支持,这里以bash为例。
cmd:cat /etc/shells com:查看当前系统 支持的shell类型
cmd:echo $SHELL com:查看当前正在使用的shell
重要:bash的配置文件
全局配置(对所有用户都生效):/etc/PRofile,/etc/profile.d/*.sh, /etc/bashrc
个人配置(对你自己生效,会覆盖全局配置):~/.bash_profile, ~/.bashrc
profile类的文件:设定环境变量、 运行命令或脚本
bashrc类的文件:设定本地变量、 定义命令别名
附加:
主要使用/etc/profile 和 ~/.bashrc 就够了。
shell读取配置文件的顺序
登陆式shell:/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非登陆式shell:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*.sh
登陆式shell和非登陆式shell
登陆式shell:正常通过某终端登陆、su - USERNAME、 su -l USERNAME切换的用户都是登陆式shell
非登陆式shell:su USERNAME切换的、图形终端打开的shell、自动执行的shell脚本子shell
建议:
如何将shell脚本执行起来也是很重要的,手动当然最简单,自动执行脚本更为重要。所以需要了解liunx操作系统的启动流程是很有必要的,了解crontab命令的使用,了解at命令的使用是很有必要的。当然还有很多其他的机制,重在积累。
常用的自动化执行脚本方式:1、crontab命令(自查,或在本人文章中搜索)2、linux系统的/etc/rc.local文件中3、at命令定时执行 4、成为linux的服务开机自动启动,有脚本chkconfig 添加,没有脚本自己写完后chkconfig添加。
python是很好的自动化运维工具,同时在爬虫和数据分析甚至开发中都表现出色。强烈建议一定要学好,好的武器可不是哪都能找到的--工欲善其事,必先利其器。
2、shell属于动态语言,在linux上多用来进行自动化执行繁复的操作。运维的好助手
3、shell语法:
各种语言的学习大致都一样,变量、函数、对象、条件语句、循环语句、输出语句
变量类型:
本地变量:
VARNAME=VALUE 作用于当前shell,子shell不能。
局部变量:
local VARIABLE=VALUE 作用于当前代码块,类似于函数中的变量
环境变量:
export VARIABLE=VALUE 作用于当前shell和子shell
VARIABLE=VALUE export VARIABLE
位置变量:
./test.sh arg1 arg2
$1 => arg1
$2=>arg2
$0=>test.sh
特殊变量:
$? 上个命令执行的状态结果,成功为0
$# 参数的个数
$* 参数列表
$@ 参数列表
"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
变量声明赋值使用:
ANIMAL=pig
echo “There are some $ANIMAL”
echo “There are some ${ANIMAL}s.”//双引号若引用进行变量替换
echo ‘There are some ${ANIMAL}s.’ //单引号强引用不进行变量替换
ANIMAL=$ANIMAL:goat //冒号不作为变量名不用加{}
export PATH=$PATH:/usr/local/apache/bin//临时生效
${parameter:-Word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
shell做运算:
A=3
B=6
let C=$A*$B 或者 C=$[$A+$B] 或者C=$(($A+$B))
echo $C
条件测试类型:
整数测试:
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个是否大于另一个
-lt 测试一个是否小于另一个
-ge 测试一个是否大于等于另一个
-le 测试一个是否小于等于另一个
.e.g 注意 [] 格式和空格,否则报错 。条件测试的表达式一般[ expression ] 还有[[ expression ]] 、test expression
[ `wc -l /etc/inittab | cut -d ‘ ’ -f1` -gt 100 ] && echo “large file” //行数大于100打印
[ 100 -gt 101 ] && echo “big file.” || echo “small file.” //两个必须执行一个
if [ $variable -eq 0 ];then
echo "#####"
echo "####"
else
echo "####"
echo "####"
fi
字符测试:
[ $A == $B ] //=号两边必须加空格,否则识别为赋值
[ $A != $B ] //测试两个字符串是否不等,注意空格
[ -n $C ] //测试字符串是否为空
[ -z $D ] //测试字符串是否不为空
文件测试:
[ -e /etc/initab ] //文件是否存在
[ -x /etc/rc.d/rc.sysinit ] //是否有可执行权限
组合条件测试:
-a: 与条件
-o:或条件
!: 非关系
if [ $a -gt 1 -a $b -le 2 ]
if [ $a -gt 1 ] && [ $b -gt 2 ]
FOR 循环:
语法:for 变量 in 列表; do
循环体
done
.e.g
for a in `ls ./`;do echo $a; done
for a in 1 2 3 4 5 6;do
echo $a
done
for a in {1..100}; do
echo $a
done
for a in `seq 1 10`;do
echo $a
done
while循环
while [ 条件 ] do
循环体
done
while true;doecho "#######"sleep 5done
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do ! which $CMD && echo "Wrong command" && read -p "Input again:" CMD && continue COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]/{1,/}"` echo $COMMAND read -p "Continue: " CMDdone
case 语句:
case $1 in[0-9]) echo "A digit." ;;[a-z]) echo "Lower" ;;[A-Z]) echo "Upper" ;;*) echo "Special character." ;;esac
函数:
bincp() {
cmdpath=${1%/*} #这个是命令的目录路径,很有用的
echo $1 #第一个参数
echo "#######"
}
#调用
bincp argument1 argument2
数组声明赋值使用循环:这篇总结的相当不错。这里为加快速度直接引用。
http://blog.sina.com.cn/s/blog_43c625f10101f1hy.html
shell中使用选项:
http://blog.csdn.net/xluren/article/details/17489667
while getopts "a:bc" arg do case $arg in a) #参数存在$OPTARG中 echo "a's arg:$OPTARG" ;; b) echo "b" ;; c) echo "c" ;; ?) #当有不认识的选项的时候arg为? echo "unkonw argument" exit 1 ;; esacdone#使用./test.sh -a hello -b -c
文件重定向:
标准输出:显示器 STDOUT 1
标准输入:键盘 STDIN 0
标准错误:STDERR 2
覆盖重定向 > 追加重定向 >>
.e.g.
ls /var > /tmp/var.txt 输出重定向
ls /var &> /tmp/var.txt 同时重定向标准输出和标准错误
tr ‘a-z’ ‘A-Z’ < /etc/fstab 输入重定向,将文件模拟成键盘
#追加内容到文件cat >>/tmp/myfile.txt<<EOF
111
2222
EOF
echo ‘Hello,World.’ | tee /tmp/hello.out //输出到屏幕一份保存到文件一份
包含文件
./script.sh #可在里边声明变量或者写函数
source filename
新闻热点
疑难解答