四、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的值
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的值
相关文章推荐
- Shell编程基础:单引号和双引号含义区别
- Shell基础篇---shell简介入门bash编程之执行
- Shell编程基础
- shell编程基础···初学者必用
- (C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹
- Shell编程基础
- Shell 编程基础
- Shell编程基础
- Shell编程基础
- Linux.Shell编程基础知识三
- Shell编程基础
- 转:(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹
- (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
- Shell编程基础
- Linux Bash Shell学习(八):shell编程基础——string操作
- Shell基础篇---shell简介之bash编程之参数说明
- Shell编程基础:单引号和双引号含义区别
- Shell编程基础
- Shell编程基础二
- shell编程基础-总结