大数据开发实用Shell梳理

  |   0 评论   |   1,284 浏览

流程控制

分支

if..else

NUM=$1
if [ ${NUM} -lt 50 ]; then
  echo "score 小于 50:"${NUM}
elif [ ${NUM} -gt 50 ]; then
  echo "大于50"
else
  echo "等于50"
fi

image.png

条件判断

字符串判断

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

image.png

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

image.png

函数

函数

function printParam() {
  echo "参数个数是:"$#
  for i in $@
  do
    echo ""$i
  done
}
printParam "hello" "world"

image.png

参数

$#传递给脚本或函数的参数个数
$*传递给脚本或函数的所有参数。被双引号(" ")包含时,将所有的参数作为一个整体,将各个参数分开,以"$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 "结果:$?"

image.png

echo

function add() {
  result=`expr $1 + $2`
  echo $result
}
echo "1 + 2 = ?"
echo `add 1 2`

image.png

数据结构

数组

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

image.png

${#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

image.png

常用场景

字符串操作

cut

image.png

  • -d指定分隔符

  • -f指定返回元素的下标

sed

image.png

awk

image.png

grep

image.png

  • -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

image.png

while read

while read line
do
  echo $line
done < /etc/hosts