shell 编程简介

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;do
echo "#######"
sleep 5
done


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: " CMD
done


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 ;;
         esac
done

#使用
./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












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值