四、Shell编程基础

来源:互联网 发布:淘宝上专柜代购的衣服 编辑:程序博客网 时间:2024/06/06 03:00
一、变量的声明、引用及作用域
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的值

0 0