参考:https://www.jb51.net/article/256177.htm 一、解释器 shell脚本解释器必须放在第一行,#!/解释器。也可以不引用,默认为/bin/bash,可以用$ echo $SHELL查看shell脚本的解释器 linux常用解释器 /bin/sh(为bash的符号引用,和bash没有区别) /bin/bash /usr/bin/sh /usr/bin/bash /usr/bin/expect(交互命令使用) 二、变量 1、环境变量 可以使用env查看系统当前的环境变量。 如PATH、USER、HOSTNAME等 2、入参(脚本入参、函数入参) $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数。 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 $n 第n个参数 3、自定义变量 定义方法:变量名=值,当值包含特殊符号,如空格等时要使用引号(单双都可以)引起来,只允许字母下划线开头,且区分大小写。 调用方法:$变量名或${变量名},当和其他字符串直接使用时,必须使用${变量名}。如${变量名}123 4、变量类型 所有数据都是以字符串形式存储,(数字或boolean 如可以 if "false")。 字符串在定义时可以用双引号、单引号或不用引号。 字符串函数: ${#a} 获取字符串长度 ${a:0:5}截取字符串 ${a/wode/nide}替换第一个字符串 ${a//wode/}替换所有wode $a$b字符串拼接 $((${a}+${b}))整数运算 字符串转数组,空格分隔的字符串($a),其他分隔符可以用${a//wode/}替换为空格,如(${str//,/ }) 数组: ${b[2]}获取第3个元素 ${b[@]} 获取所有元素 ${#b[@]}获取数组长度 三、注释 # 开头,单行注释 <<EOF … EOF 或 :<<! … ! :多行注释 #!/bin/bash : 主要用于指定解释器 四、异常处理 set +e 当前行以下命令异常,跳过当前命令继续执行 set -e 当前行以下命令异常,立即停止并报错 五、结构语句 1、if分支
#!/usr/bin/bash
#本程序实现手动输入两个数,并且判断其大小。by:浩道linux
#提示分别输入两个要判断的数
echo "请输入两个数:"
read -p "请输入第一个数:" a
read -p "请输入第二个数:" b
if [ $a -gt $b ];then
echo "第一个数大于第二个数!"
elif [ $a -lt $b ];then
echo "第二个数大于第一个数!"
else
echo "第一个数等于第二个数!"
fi
#if [[ $a > $b ]] ; then echo $a; else echo puss; fi 可以不还行,但要用分号隔开
#使用> < && || 时条件必须使用[[]]阔起来。
2、case分支
case $a in
1)
echo yes ;;
2)
echo no ;;
esac
# case $c in 1) echo yes ;; 2) echo no ;; *) echo erro ;; esac 可以不换行
3、for循环
a=(a b c d e)
for i in ${a[@]};
do
echo $i;
done
六、函数 1、特殊函数 2、自定义函数
sum 1 2 5 5 #可以在函数前调用
a=$?
echo $a
function sum(){
sum=0
for n in $@
do
((sum+=n))
done
return $sum
}
七、特殊命令 八、抽取项目日志到hive表的shell脚本案例
#!/bin/bash
hosts=$1
port=$2
username=$3
password=$4
pathname=$5
filename=$6
src_file=$5$6
default_file=$7
dest_file=$6
filter_file="temp_"$6
filter_word=$8
table_name=$9
partition=${10}
echo "user name = ${USER}"
pwd
array=(${hosts//,/ })
for host in ${array[@]}
do
set +e
/usr/bin/expect <<-EOF
spawn scp -P $port $username@$host:$pathname{\*/$filename,$default_file\} .
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof
EOF
set -e
if [[ ! -f "$dest_file" ]]; then
cat $default_file | grep "${filter_word}" >> $filter_file
echo "获取原始文件"
else
cat $dest_file | grep "${filter_word}" >> $filter_file
rm -f $dest_file
fi
done
hive -e "load data local inpath '${filter_file}' overwrite into table ${table_name} partition ( dt = '${partition}')";
rm -f $filter_file
echo Done!!!
九、设置定时任务
crontab -u //设定特定用户的定时服务
crontab -l //列出当前用户定时服务内容
crontab -r //删除当前用户的定时服务
crontab -e //编辑当前用户的定时服务 会进入编辑页面
添加:
0 0-3 * * * 脚本文件