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

四、Shell编程基础

2017-05-09 12:16 211 查看
一、变量的声明、引用及作用域

1、Shell程序

以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就是Shell脚本程序。

通常由一段Linux命令、Shell命令、控制语句以及注释语句构成。

Shell脚本的编写

  Shell脚本是纯文本文件,可以使用任何文本编辑器编写。

  Shell脚本通常是以.sh作为后缀名

Shell程序:

 第一行:指定用哪个程序来编译和执行脚本。

 #!/bin/bash     #!/bin/sh

 注释行:使用(#)符号

 

2、变量:

 变量命名:
变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。任何其他字符都标志变量名的结束。
变量名关于大小写敏感。
name=hellotg
echo $name
NAME=HELLO
ech $NAME
echo{$name}
-----------------------
在root下创建新用户
adduser tgtest
passwd tgtest
-----------------------

 变量类型
根据变量的作用域,变量可以分为本地变量和环境变量。
本地变量只在创建它们的Shell程序中可用,而环境变量则在Shell中的所有用户进程中可用,通常也称为全局变量。

 变量赋值

   等号两边不能有空格

   如果要给变量赋空值,可以在等号后面跟一个换行符。

 显示变量的值

   echo $variable 或echo ${variable}

  清除变量

   unset variable

  显示所有的变量

   set

   

 环境变量
环境变量称为全局变量,按照惯例需要大写。
export LANG
 注意:可被所有的Shell环境下访问。
 如果父Shell进程产生了子Shell进程,则环境变量可被“继承”并复制。

  

二、位置参量使用和命令执行状态码

 vi test.sh

 #!/bin/bash

 

 echo "hello shell"

 保存

 chmod u+x test.sh

 执行:

    ./test.sh
. test.sh
sh test.sh

1、位置参量

 1)位置参量是一组特殊的内置变量,通常被shell脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。

 2)执行Shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。

 3)在脚本中使用这些参数时,需通过位置参量来引用。例如:$1表示第一个参数,$2表示第二个参数,以此类推。$9以后需要用花括号把数字括起来,如第10个位置参量以${10}的方式来访问。

 4)位置参量列表

 $0:当前脚本的文件名

 $1-$9:第1个到第9个位置参量

 ${10}:第10个位置参量,类似地,有${11},......

 $#:位置参量的个数

 $*:以单字符串显示所有位置参量

 $@:未加双引号时与$*含义相同,加双引号时有区别

 $$:脚本运行的当前进程号

 $!:最后一个后台运行进程的进程号

 $? :显示前面最后一个命令的退出状态。0表示没有错误,其他任何值表示有错误。

 给Shell程序传递参数

   shell-test.sh This is Peter

 如果位置参量中含有空格,则需要使用双引号

 shell-test.sh This is "Peter Piper"

 5)退出码

 任何命令进行时都将返回一个退出状态。

 查看命令:echo $?

 应用中通常会在关键步骤后判定$?,已确定关键步骤的执行是否正常。尤其调度系统里需要监控sh返回码。

 Shell脚本的返回码取决于最后一个命令的返回码。

 程序控制返回码:exit N

   退出状态0成功,无错误

   退出状态大于0,失败,某处有错误。

 

三、数组、data和cal命令讲解

1、数组

数组定义 arr=(zhangsan lisi wangwu)

echo ${arr[0]}

echo ${arr[2]}

echo ${arr[*]} 所有元素

echo ${#arr[*]} 数组个数

arr[0]=tgtest 数组元素赋值

2、date

man date

date +%Y-%m-%d

date +%Y/%m/%d-%H:%M

test.sh脚本中有如下内容:

#!/bin/bash

date1=$(date)

echo ${date1}

date2=$(date --date='2 days ago' +%Y-%m-%d)

echo ${date2}

date3=${date --date='-1 days ago' +%Y-%m-%d}

echo ${date3}

date4=${date --date='-1 days' +%Y-%m-%d}

echo ${date4}

date5=${date --date='1 days' +%Y-%m-%d}

echo ${date5}

-----------------------------

sh test.sh

=============================

cal命令

如果想要列出目前这个月份的月历,直接用cal即可

cal查看日历

cal 2016

基本上cal这个指令可以接的语法为:

cal [month] [year]

eg:cal 09 2015

如果想要知道2009年10月的月历,可以直接下达:

cal 10 2009

-----------------------------

age=25

echo $age

echo ${age}

echo "$age"

四、判断表达式及if语句使用

1、判断

 1.关于某个档名的“文件类型”判断,如test -e filename 表示是否存在

   -e 该“档名”是否存在

   -f 该“档名”是否存在且为文件(file)?

   -d 该“文件名”是否存在且为目录(directory)?

 2.关于档案的权限检测,如test -r filename表示可读否(但root权限常用例外)

   -r 检测该档名是否存在且具有“可读”的权限?

   -w 检测该档名是否存在且具有“可写”的权限?

   -x 检测该档名是否存在且具有“可执行”的权限?

 3.关于两个整数之间的判断,例如test n1 -eq n2

 -eq 两数值相等(equal)

 -ne 两数值不等(not equal)

 -gt n1大于n2(greater than)

 -lt 小于(less than)

 -ge 大于等于(greater than or equal)

 -le 小于等于(less than or equal)

 4.判断字符串的数据

 test -z string 判断字符串是否为0?若string为空字符串,则为true。

 test -n string 判断字符串是否不为0?若string为空字符串,则为false。注意:-n也可省略

 test str1=str2 判断str1是否等于str2,若相等,则回传true。

 test str1!=str2 判断str1是否不等于str2,若相等,则回传false。

2、if判断

 1.单层、简单条件判断式

 如果你只有一个判断式要进行,那么可以简单的这样写:

 if[条件判断式];then

    当条件成立时,执行的指令

 fi

 注意:将if反过来写,结束if之意。

 &&&多个条件的时候,可以用多个中括号来隔开。&&表示and,||代表or; 

 if["$yn"=="Y"]||["$yn"=="y"];then

    echo "OK,continue"
exit 0

  fi

 2.多重、复杂条件判断式

 #一个条件判断,分成功与失败

 if[条件判断式];then

   条件成立,执行此部分

 else

   条件不成立,执行此部分

 fi

 

 #多个条件判断(if...elif...elif...else)分多种不同情况执行

 if[条件判断一];then

    当条件1成立,执行此部分

 elif[条件判断二];then

    当条件2成立时,执行此部分

 else

    当条件1、2均不成立时,执行此部分

 fi

 注意:elif也是个判断式,因此elif后面都要接then来处理。但是else已经是最后的没有成立的结果了,所有else后面没有then。

五、for循环、while循环

1、for循环

for var in con1 con2 con3

do

  程序段

done

以上面的例子来说,这个$var的变量内容在循环工作时:

1.第一次循环时,$var的内容为con1;

2.第二次循环时,$var的内容为con2

3.第三次循环时,$var的内容为con3

4. ......

例如:

for animal in dog cat elephant

do 

  echo "There are ${animal}s...."

done

----------------------

vi test.sh

#!/bin/bash

for var in 1 2 3 4 5 

do

  echo ${var}

done

echo "===================="

num=10

s=0

for((i=0;i<${num};i=i+1))

do

  s=$((${s}+${i}))

done 

echo ${s}

2、while循环

while do done,until do done

1.while[condition]

do

  程序段落

done

当condition条件成立时,就进行循环,直到Condition的条件不成立才停止。

2.until[condition]

do

  程序段落

done

这种方式与while相反,当condition条件成立时,就终止循环,否则就持续进行循环的程序段。

--------------------------

${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves}

表示如果前面HADOOP_SLAVES的值不存在的话,就使用后面{HADOOP_CONF_DIR}/slaves的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: