shell入门基本使用

Shell概述

是一个命令行解释器,可以接收用户命令来控制电脑,另外也是一种编程语言。shell是本质上是Linux命令,我们将符合shell语法的命令编写的代码被称为shell脚本。

shell有两种解释器:可以在/etc/passwd文件中查询各个用户使用的解释器类型

  • 开发者使用的bash解释器
  • 系统使用的nologin解释器

为何使用shell脚本不需要编译

pstree : 进程关系树
exit:退出当前进程
bash:调用bash

总结一下,我们在终端使用shell命令其实就是在bash解释器里面执行,相当于解释执行与一体了。

编写Shell脚本

  1. 创建脚本文件helloworld.sh,vim打开编辑
  2. #!bin/bash: 第一行,指定解释器
  3. 编写shell命令 echo "hello\tworld"
  4. bash helloword.sh./helloworld.sh
  5. 修改环境变量:PATH = $PATH:脚本的文件路径
  6. 此时可以在任意路径执行该命令 helloworld.sh

1.变量的使用

定义自己的变量时使用小写字母或者驼峰式名法,系统变量全部大写。定义变量的语法:

  1. 变量名=变量值(注意不能有空格)
  2. 撤销变量:unset 变量名
  3. 声明静态变量:readonly 变量名,注意不能unset

2.特殊变量

变量 含义
$n 代表参数,$0表示脚本自己的名称
$# 代表参数的个数
$* 代表所有参数,当做一个整体
$@ 代表所有参数,不当做一个整体
$? 返回上一个命令的执行状态,如果是0,表示执行成功

3.运算符

语法:$((运算表达式))$[运算表达式]

4.添加判断

判断方法1:test 1 -eq 1 : 判断1是否等于1
echo $? :查询比较结果
判断方法2:

  • [ 1 -eq 1 ] : 判断1是否等于1,注意中括号两侧必须有空格隔开。
  • [ -r/w/x 文件名 ] : 判断文件是否有有读/写/执行权限
  • [ -e/f/d 文件名 ] : 判断文件存在/是否是文件/是否是目录

(1)两个整数之间比较

-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)

(2)按照文件权限进行判断

-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)

(3)按照文件类型进行判断

-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)

5.三元运算符

  • [ 判断表达式 ] 代码1 || 代码2 : 表达式为真执行1,否则执行2

6.流程控制

if语句

  • 单分支:if [ 条件判断式 ] then 程序 fi
  • 双分支if [ 条件判断式 ] then 程序1 else 程序2 fi
  • 多分支
if [ 条件判断式 ]  then
代码1
elif [ 条件判断式 ] then
代码2
else 
代码3
fi

示例代码

 1 #!/bin/bash
  2 
  3 if [ $# -ne 1 ]
  4 then
  5         echo "Parameter number error, msut be 1 parameter"
  6         exit
  7 fi
  8 
  9 if [ $1 -eq 1 ]
 10 then
 11         echo "进入第一个分支"
 12 elif [ $1 -eq 2 ]
 13 then
 14         echo "进入第二个分支"
 15 else
 16         echo "进入了第三个分支"
 17 fi

case语句

语法格式

case $1 in
"值1")
代码1
;;
"值2") 
代码2
;;
*) //表示default
代码

示例代码

功能:使用switch实现春夏秋冬分支结构

#!/bin/bash
case $1 in
"1")
	echo "spring"
;;
"2") 
	echo "summer"
;;
"3")
	echo "autumn"
;;
"4")
	echo "winter"
;;
*)
	echo "Input error"
;;
esac

7.单引号和双引号

单引号是单纯将字符变成字符串,双引号会解析里面的变量。如果有嵌套使用,看最外层的。

8.循环

for循环

格式1:

for (( 初始值;循环控制条件;变量变化 )) 
do 
    程序 
done

格式2:

for 变量 in 值1 值2 值3… 
do 
    程序 
done

示例代码

功能:用循环统计1-100的和

  1 #!/bin/bash
  2 sum=0
  3 for ((i=0;i<=100;i++))
  4 do
  5         sum=$[ sum + i ]
  6 done
  7 echo $sum

功能:用循环打印三句话

#!/bin/bash

for i in $1 $2 $3
do 
        echo "I like $i"
done

while循环

while [ 条件判断式 ] 
do 
    程序
done

示例代码

功能:计算1-100的和

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
        sum=$[ sum + i ]
        i=$[ i + 1 ]
done

echo $sum

9.从控制台读取输入

read -p ‘please input your name’ -t 10 : 读取控制台字符串输入,打印提示,并等待10秒。
read (选项) (参数)

  • 选项:
    • -p : 指定读取值的提示符
    • -t : 指定读取值时等待的时间,不加表示一直等待
  • 参数: 指定读取值的变量名

示例脚本:

#!/bin/bash
read -t 7 -p 'Enter your name in 7 seconds:' name
echo $name

函数

1.系统函数

  1. basename : 以 /分割路径,获取最后一个
    • basename read.sh .sh: 删除后缀
  2. dirname: 以/分割,获取前面那部分,即目录路径

2.自定义函数

  1. 基本语法
[ function ] funname[()]
{
	Action;
	[return int;]
}
  1. 写一个a+b代码示例
//方法定义
#!/bin/bash
fuction sum()
{
	echo $[ $1 + $2 ]
}
//方法调用
sum $1 $2
  1. 注意点:
    • 函数必须先声明
    • 函数返回值:返回值范围[0-255]
      • 可以加return 变量名,作为返回结果
      • 可以不加,以最后一条命令作为结果
    • 函数里面使用$1和$2来表示参数
    • 写脚本时,写好函数时要记得调用 sum $1 $2

Shell工具(重点)

cut命令

负责剪数据,从文件的每一行剪切字节、字符和字段这些数据。

  • cut [选项参数] filename
    • -f : 提取第几列(1-4,提取1~4列)
    • -d : 分隔符,比如空格或者,
    • -c : 按照字符切割,切的太碎了,不常用

示例代码:获取IP地址

ens33: flags=4163  mtu 1500
        inet 192.168.10.102  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::b2fa:151d:8dd7:e817  prefixlen 64  scopeid 0x20
        ether 00:0c:29:a1:0d:83  txqueuelen 1000  (Ethernet)
        RX packets 42864  bytes 4930739 (4.7 MiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 16943  bytes 2768715 (2.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig ens33 | grep netmask | cut -d "i" -f 2|cut -d " " -f 2
这里没有直接使用-d " "来进行分割是因为cut命令无法自动丢弃使用空格分隔时产生的""字符,每两个连续的空格都会产生一个。

awk命令

是一个文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

语法 : awk [选项参数] 'pattern{操作1} pattern{操作2}' filename

  • -F : 指定文件分隔符
  • -v: 赋值一个用户定义变量

awk的内置变量

变量 说明
FILENAME 文件名
NR 已读的记录数(行号)
NF 浏览记录的域的个数(切割后,列的个数)

代码示例1:获取用户名和bash解释器,通过类似列表的形式打印

awk -v i=1 -F : '{print i " " $1 " " $7}{i=i+1}' passwd

代码示例2: 查找ifconfig中的空行的行号

ifconfig | awt '/^$/{print NR}'

代码示例3: 获取IP地址, awk 会自动丢弃多余的“”

ifconfig | awk '/broadcast/{print $2}'

正则表达式

表达式 含义
^a 以a开头
a$ 以a结尾
. 任意一个字符
* 不单独使用,表示出现0次或多次
.* 匹配任意字符
[ ] 匹配括号里面的字符
[ 0-9] 匹配任意一个数字
[ 0-9]* 匹配任意长度的数字字符串
[ a-z]* 匹配任意长度的小写字符串
a$b 匹配特殊字符$

你可能感兴趣的:(大数据,linux)