大数据开发实用Shell梳理
- 流程控制
- 分支
- if..else
- 条件判断
- 字符串判断
- 数字的判断
- 文件的判断
- 复杂逻辑判断
- 循环
- for
- for...in
- while...do
- until
- 变量
- 定义
- 命名规则
- 示例
- 函数
- 函数
- 参数
- 获取返回结果
- return
- echo
- 数据结构
- 数组
- Map
- 常用场景
- 字符串操作
- cut
- sed
- awk
- grep
- 逐行遍历文件
- for...cat
- while read
- 文件锁
- 设定命令超时时间
- 遍历日期区间
流程控制
分支
if..else
NUM=$1 if [ ${NUM} -lt 50 ]; then echo "score 小于 50:"${NUM} elif [ ${NUM} -gt 50 ]; then echo "大于50" else echo "等于50" fi
条件判断
字符串判断
str1 = str2 | 当两个串有相同内容、长度时为真 |
str1 != str2 | 当串str1和str2不等时为真 |
-n str1 | 当串的长度大于0时为真(串非空) |
-z str1 | 当串的长度为0时为真(空串) |
str1 | 当串str1为非空时为真 |
数字的判断
int1 -eq int2 | 两数相等为真 |
int1 -ne int2 | 两数不等为真 |
int1 -gt int2 | int1大于int2为真 |
int1 -ge int2 | int1大于等于int2为真 |
int1 -lt int2 | int1小于int2为真 |
int1 -le int2 | int1小于等于int2为真 |
文件的判断
例如Shell实现任务同步(_SUCCESS标志文件)中检测文件是否存在的if [ -f ${DOWNLOAD_DIR}/${VERIFY_MARK} ];
-r file | 用户可读为真 |
-w file | 用户可写为真 |
-x file | 用户可执行为真 |
-f file | 文件为正规文件为真 |
-d file | 文件为目录为真 |
-c file | 文件为字符特殊文件为真 |
-b file | 文件为块特殊文件为真 |
-s file | 文件大小非0时为真 |
-t file | 当文件描述符(默认为1)指定的设备为终端时为真 |
复杂逻辑判断
-a | 与 |
-o | 或 |
! | 非 |
循环
for
for((i=1; i<=5; i++)) do echo $i done
for...in
for line in `cat sample.txt` do echo $line done
while...do
i=1 while [ $i -le 5 ] do echo $i let i++ done
until
和while相反
i=1 until [ $i -gt 5 ] do echo $i let i++ done
变量
定义
variableName="value"
命名规则
变量名和等号之间不能有空格
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
示例
var1="hello" var2="world" echo $var1 #将变量定义为只读变量,只读变量的值不能被改变 readonly var1 var1="good" #不能删除只读变量 unset var1 #删除变量 unset var2 echo "var2:"$var2
函数
函数
function printParam() { echo "参数个数是:"$# for i in $@ do echo ""$i done } printParam "hello" "world"
参数
$# | 传递给脚本或函数的参数个数 |
$* | 传递给脚本或函数的所有参数。被双引号(" ")包含时,将所有的参数作为一个整体,将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数 |
获取返回结果
return
return只能返回0~255之间的整数值,且需要借助于$?获取返回值
func() { if [ $1 -gt 10 ]; then return 10 else return 0 fi } func 20 echo "结果:$?" func 1 echo "结果:$?"
echo
function add() { result=`expr $1 + $2` echo $result } echo "1 + 2 = ?" echo `add 1 2`
数据结构
数组
arr=(A B C D) for((i=0; i< ${#arr[@]}; i++)) do echo "第${i}个参数是:"${arr[i]} done #给元素赋值 arr[4]='E' #遍历所有元素 for item in ${arr[@]} do echo $item done
${#arr[index]} | 获取数组元素 |
arr[index]=value | 给元素赋值 |
${#arr[@]}或${#arr[*]} | 获取数组长度 |
${arr[@]}或${arr[*]} | 获取所有元素 |
Map
#定义Map declare -A userInfo=(["zs"]="男" ["ls"]="女" ["ww"]="未知") #Map赋值 userInfo["mm"]="女" #遍历所有key for key in ${!userInfo[@]} do #根据key获取元素 echo ${userInfo[$key]} done
常用场景
字符串操作
cut
-d指定分隔符
-f指定返回元素的下标
sed
awk
grep
-o指定显示匹配的部分
-P指定使用Perl regular expression匹配
逐行遍历文件
for...cat
echo "默认分隔符的情况" for line in `cat /etc/hosts` do echo $line done #默认值是“space, tab, newline”这里指定为newline IFS=" " echo "指定分隔符为换行符" for line in `cat /etc/hosts` do echo $line done
while read
while read line do echo $line done < /etc/hosts
文件锁
/usr/bin/flock -xn /var/run/batches.lock -c '/usr/bin/python -m SimpleHTTPServer'
设定命令超时时间
timeout 3s ping cxy7.com if [[ $? != 0 ]]; then echo "执行命令超时,退出..." else echo "执行成功..." fi
遍历日期区间
begin_date=2020-05-01 end_date=2020-05-05 begin_ts=`date -d "$begin_date" +%s` end_ts=`date -d "$end_date" +%s` for (( i=${begin_ts};i<=${end_ts};i=i+86400)) do dt=$(date -d @${i} +%Y-%m-%d) echo $dt done
读后有收获可以支付宝请作者喝咖啡
