您的位置:首页 > 运维架构 > Shell

shell 编程简介

2017-02-10 10:47 176 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell unix