大数据 Shell基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Notzuonotdied/article/details/82665268

前言

介绍

Shell 是用来解决什么问题的? - 伟哥-Wayne的回答 - 知乎

Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?

Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。

Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。

完整教程

Shell执行方式

  1. ./test.sh
  2. sh test.sh
  3. source test.sh

方式1和方式2其实是一样的,都是在当前父进程下的子进程中执行,子进程执行结束之后,子进程中的变量和操作将会结束而且不会传回到父进程中。

换句话说,方式1和方式2是作用于子进程本身,方式3则作用于整个父进程

Shell变量

查看系统变量可以使用set命令查看。

变量的声明采用的是变量名=值的方式定义,而且等号的左右不能有空格,否则报错,变量名称一般习惯采用大写。

在定义变量的时候,双引号是允许格式化字符串,比如Hello World!$USERNAME输出结果为Hello World!Linux。而单引号禁止格式化字符串,即Hello World!$USERNAME输出结果为Hello World!$USERNAME

  • 双引号的优点:
    • 双引号里可以出现转义字符
    • 双引号里可以有变量
  • 单引号的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

系统变量可以使用unset 变量名撤销。

如果想要把一个变量升级为全局环境变量,可以采用export关键字来提升。

如果希望变量只读,可以使用readonly关键字声明,比如readonly 变量名

特殊变量替换

变量替换 说明
${var:-value} 如果变量var的值未被设置或者为null,使用value作为变量var的值进行替换。否则,使用var的值进行替换。在替换的过程中,变量var的值不变。
${var:=value} 如果变量var的值未被设置或者为null,则将value赋给变量var,并进行替换。
${var:+value} 如果变量var的值未被设置或者为null,则使用null进行替换。否则,使用value进行替换。在替换的过程中,变量var的值不变。
${var:?value} 如果变量var的值已经设置,则使用var的值替换。如果变量var的值未被设置或者为null,则使用value作为错误提示信息。如果省略了value,则输出默认的错误提示信息,表示var未被设置,然后终止脚本执行。在替换过程中,var的值不变。

Shell运算符

获取执行结果

  • what=`ls -al`
    • 执行ls -al并将执行结果赋值给变量what
  • what=$(ls -al)
    • 同上,注意:$()是赋值操作。
  • expr,可以使用expr表达式计算表达式的结果。
    • 注意:expr表达式后面的运算符和变量都需要用空格分隔。
    • 例如计算 ( 3 + 4 ) × 12 (3+4)×12 【仅仅支持整数运算】
      • a=`expr 3 + 4` * 12
      • 等价于a=$(((3+4)*12))
      • 注意:$(())用于表达式结果计算,必须是双重小括号。

参数传递

参数处理 参数处理说明
$# 传递到脚本的参数个数。
$* 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号。
$! 后台运行的最后一个进程的ID号。
$@ $*相同,但是使用时加引号,并在引号中返回每个参数。如"$@“用「”」括起来的情况、以"$1" “$2” … "$n"的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

流程控制

shell for

# !/bin/bash

# 多层循环
for N in 1 2 3
do 
  echo $N
done

# 单行显示
for N in 1 2 3; do echo $N; done

# 当行显示
for N in {1..3};do echo $N; done

for ((i=0;i<=5;i++))
do
  echo $i
done

for ((i=0;i<=5;i++));do echo $i;done;

while循环

i=1

while ((i<=3))
do
  echo $i
  let i++
done
unset i

case

case $1 in
  start)
    echo "starting"
    ;;
  stop)
    echo "ending"
    ;;
  *)
    echo "Usage:{start|stop}"
esac

这里写图片描述

Shell 关系运算符

字符串比较

注意:Linux中,true是0,false是1……
说明:执行了举例中的代码后,需要执行echo $?来输出结果。

运算符 说明 举例
= 字符串比较 [ 0 = 0 ]输出结果为0
-lt 小于 [ 4 -lt 5 ]输出结果为0
-le 小于等于 [ 4 -le 4 ]输出结果为0
-eq 等于 [ 4 -eq 4 ]输出结果为0
-gt 大于 [ 4 -gt 5 ]输出结果为1
-ge 大于等于 [ 4 -ge 5 ]输出结果为1
-ne 不等于 [ 4 -ne 5 ]输出结果为0

这里写图片描述

注意:表达式需要用中括号包裹起来,而且中间必须使用空格分隔,否则报错

文件操作

说明:执行了举例中的代码后,需要执行echo $?来输出结果。

运算符 说明 举例
-r 是否有读的权限。 [ -r "test1.sh" ]
-w 是否有写的权限。 [ -w "test1.sh" ]
-x 是否有执行的权限。 [ -x "test1.sh" ]
-f 文件是否存在bin是一个常规的文件。 [ -f "test1.sh" ]
-s 文件是否存在且不为空。 [ -s "/opt" ]
-d 文件是否存在且是一个块设备。 [ -b "/dev/block/7:0" ]
-L 文件是否存在且是一个链接。 [ -L "/usr/bin/java" ]

这里写图片描述

Shell函数

注意事项如下

  1. 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。【解释型】
  2. 函数返回值,只能通过$?系统变量获得,可以显示加:return返回;如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值 n ( 0 255 ) n(0-255)

这里写图片描述

# !/bin/bash

add() {
  temp=$(($1+$2))
  return temp
}

add 11 22
a=$?

echo --------------
echo "11 + 22 = $a"

输出结果是:

--------------
11 + 22 = 33

Shell调试

shell的调试可以在sh 命令后指定参数-vx,比如sh -vx test1.sh
  
这里写图片描述

Shell 高级指令

  • cut
  • sort
  • uniq
  • wc
    • -c--bytes--chars:只显示Bytes数;
    • -l--lines:只显示列数;
    • -w--words:只显示字数。
  • sed
  • awk

附录

猜你喜欢

转载自blog.csdn.net/Notzuonotdied/article/details/82665268