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

大数据企业学习篇01之---Linux的那些事

2017-10-30 17:46 351 查看
6.while read line

从文本中读取每一行

例子:

while read line
do
echo "drop  table ${line}_bak;">>2.txt
#echo "被删除的表为:"
#echo ${line}'_bak'
done < delete.txt


一.shell必知必会

1.变量
1)**变量的命名**:变量名必须以**字母或者下划线开头**,后面可以跟**数字、字母、下划线**,**任何其他字符**都标志变量的结束。
2)变量名关于大小写**敏感**。
3)**变量的类型**:变量可分为**本地变量**和**环境变量**,**本地变量**只在创建它的shell程序中有用,**环境变量**则在shell中的所有用户进程中有效,也被称为**全局变量**。按照惯例需要大写。
4)使用变量,只需要在已定义的变量前加$即可


name='xiaojiangshi'
echo $name //xiaojiangshi
echo ${name} //xiaojiangshi(推荐使用,{}用于识别变量的边界)


5)修改(重新定义变量)
name='xiaojiangshi'
echo ${name} //xiaojiangshi
name='taobao'
echo $name   //taobao
***注意:***只有在使用变量时才要加$,二次复制不需要

6)删除变量
echo $name //xiaojiangshi
unset name //删除变量
echo $name //空值


2.字符串

1)单引号

str='I am xiaojiangshi' //I am xiaojiangshi
**注意:**单引号里的任何字符都会原样输出,单引号中不能出现单引号(转义后也不行)


2)双引号

str='xiaojiangshi'
echo "hello,\"$str\"!" //hello,xiaojiangshi!


注意:双引号中可以有变量,又可以有转义字符

3)拼接字符串

name='xiaojiangshi'
str1="hello,$name" //hello,xiaojiangshi
age=18
str2="your name is $age" //your name is 18
echo ${str1} ${str2} //hello,xiaojiangshi your name is 18


4)获取字符串的长度

str="xiaojiangshi"
echo ${#str}    //输出12


5) 提取子字符串

str="xiaojiangshi"
echo ${str:1:4}  //输出iaoj


6)查找子字符串

str="xiaojiangshi"
echo `expr index "$str" ao` //输出3


3.shell 数组

1)定义数组(用括号表示数组,数组元素用空格分隔)

arr=(1 2 9 10)
echo ${arr[1]}  //输出2


或者
arr(0)=1
arr(1)=2
arr(2)=9
arr(3)=10


2)读取数组

echo ${arr[1]}  //输出2


输出所有元素:

echo ${arr[@]} //输出1 2 9 10


3)获取数组的长度

echo ${#arr[@]} //输出4


获得数组中单个元素的长度

echo ${#arr[1]} //输出1


4.位置参数

1)n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
例如:定义一个test.sh
#!/bin/sh
echo ”0 ”

echo ” 1”echo”2 “

sh test.sh  xiaojiangshi hadoop hdfs
输出:test.sh xiaojiangshi hadoop


2)$# 传递参数的个数

sh test.sh  xiaojiangshi hadoop hdfs
echo $#   //输出3


3)$? 显示最后命令的退出状态,0表示没有错误,其他任何值表示有错误。

sh test.sh  xiaojiangshi hadoop hdfs
echo $?   //输出0


4.echo 显示命令的执行结果

echo `date` //输出Wed Nov 1 15:39:45 CST 2017


5.流程控制语句

1)if

if [条件判断式];then

command;

fi

或者

if [条件判断式];then

command;

elif [条件判断式];then

command;

else

command

fi

2)for

格式:for var in values

do

command

done

下面已计算1到10的和为例

#!/bin/sh
sum=0
for ((i=1;i<=10;i++))
do
sum=`expr $sum + $i`
done
echo $sum  //输出55


3)while

格式:while[condition]

do

command

done

以求1-10的和为例:

#!/bin/sh
i=1
sum=0
while(($i<=10))
do
sum=$(($sum+$i))
i=$i+1
done
echo $sum    //输出55


二.在Linux当中,自带的调度功能crontab

针对用户,每个用户都可以调度自己的任务

例如:在小僵尸用户下创建定时任务

1)每分钟执行一次,并将文件写入到指定文件中

*/1 * * * * /bin/date >> /home/xiaojiangshi/web.log


2)列出所有的定时任务

crontab -l


3)删除所有的定时任务

crontab -r


4)crontab的基本定义

语法:* * * * * command

第一列:分钟,取值范围为1~59

第二列:小时,取值范围为0~23

第三列:日, 取值范围为1-31

第四列:月, 取值范围为1-12

第五列:星期,取值范围为0-6(其中0表示星期天)

注意:(假设前5个星分别对应c1-c5)

1.当c1为* 表示每分钟执行,当c2为*时表示每小时都要执行

例如:每分钟执行一次test.sh这个脚本

* * * * * sh test.sh


2.当c1为T1-T2时,表示从T1分钟到T2分钟这段时间内执行,以此类推
例如:每天20:00到23:00执行,每半小时执行一次
*/30 20-23 * * * sh test.sh
3.当c1为a,b,c...表示第a,b,c...分钟要执行,以此类推
例如:每个月1,11,21 的2:30执行
30 2 1,11,21 * * sh test.sh
4.当c1为*/n时,表示每分钟执行一次,以此类推
例如:每一小时执行一次
* */1 *  *  *  sh test.sh
***干货:***
0表示键盘输入
1表示标准输出
2表示错误输出


00 06 * * * source /etc/profile && cd /home/xiaoju/autosql/a && sh Main.sh > main.log 2>&1 &


解析:>main.log 2>&1 &

首先,左边的表示是标准输入重定向到文件main.log, 2>&1将错误输出重定向到标准输出,&表示放到后台运行。

注意(配置定时任务时):

1.在SHELL中设置了必要的环境变量;例如一个shell脚本手工执行OK,但是配置成后台作业执行时,获取不到ORACLE的环境变量,这是因为crontab环境变量问题,Crontab的环境默认情况下并不包含系统中当前用户的环境。所以,你需要在shell脚本中添加必要的环境变量的设置。

2.尽量所有的文件都采用完全路径方式,避免使用相对路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数据 shell linux