加载中...
Linux Shell基础
发表于:2021-09-14 | 分类: 平台

1 Shell基础

什么是shell?目前常用的操作系统(Windows、U/L、Android、iOS等)都带有图形界面,然 而,早期的计算机并没有图形界面,人们只能使用命令来控制计算机。其实,真 正能够控制计算机硬件(CPU、内存、显示器)的只有操作系统内核(Kernel), 图形界面和命令行都是架设在用户和内核之间的桥梁,是为了方便用户控制计算 机而存在的。Shell 也是一种编程语言,主要用来开发一些实用的、自动化的小工具,例如,检测计算机的硬件参数、搭建Web运行环境、日志分析等。对Linux运维工程师来说,Shell更是必须掌握的技能。Shell使自动化管理服务器集群成为可能,否则用户只能一个一个地登录所有的服务器,对每一台服务器进行相同的设置,而这些服务器可能有成百上千之多,用户会在重复性的工作上浪费大量时间。

1.1查看Shell版本

1
2
3
4
5
6
7
cat /ect/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

1.2 Shell变量类型

Shell变量分为四类,分别为自定义变量、环境变量、位置变量和预定义变量。

  • 根据工作要求临时定义的变量称为自定义变量
  • 环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行 只使用 不定义
  • 从命令行、函数或脚本执行等处传递参数时,$0、$1称为特殊位置变量
  • 预定义变量是在 bash 中已有的变量,可以直接使用,如@@、*等。

1.2.1 自定义变量

自定义变量可以理解为局部变量或普通变量,只能在创建它们的Shell函数或Shell脚本中使用,自定义变量的说明如表所示。

定义自定义变量 变量名=变量值,字母下划线开头,区分大小写
使用自定义变量 $变量名
查看自定义变量 echo$变量名 set(所有变量)
取消自定义变量 unset 变量名
自定义变量使用范围 仅在当前Shell中有效
1
2
3
4
5
6
7
8
9
#!/bin/bash
#分支结构
host=www.baidu.com
if ping -c1 $host &>/dev/null
then
echo "network ok"
else
echo "bad network"
fi

1.2.2环境变量

环境变量也可称为全局变量,可以在创建它们的Shell及其派生出来的任意子进程Shell中使用。环境变量的说明如表所示。

1
2
3
4
5
#查看
echo $PATH
#修改
PATH=$PATH:/bin/new
export PATH

1.2.3位置变量

在Shell中存在一些位置变量。位置变量用于在命令行、函数或脚本中传递参数,其变量名不用自己定义,其作用也是固定的。执行脚本时,通过在脚本后面给出具体的参数(多个参数用空格隔开)对相应的位置变量进行赋值。
$0代表命令本身,$1-$9代表接收的第1~9个参数,1010以上需要用{}括起来,如{10}代表接收的第10个参数。

1
2
3
4
5
6
7
8
9
10
11
[hadoop@master shell]$ cat ping06.sh 
#!/bin/bash
ping -c1 $1 &>/dev/null

if [ $? -eq "0" ];then
echo "network to $1 is ok"
else
echo "bad network to $1"
fi
[hadoop@master shell]$ sh ping06.sh www.baidu.com
network to www.baidu.com is ok

1.2.4预定义变量

$0 脚本名
$* 所有参数
$@ 所有参数
$# 参数的个数
$$ 当前进程PID
$! 上一个进程PID
$? 上一个命令返回值,0代表成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[hadoop@master shell]$ ls &
[1] 6950
[hadoop@master shell]$ ip.txt ping03.sh ping04.sh ping05.sh ping06.sh ping07.sh read

[1]+ 完成 ls --color=auto
[hadoop@master shell]$ $!
-bash: 6950: 未找到命令

[hadoop@master shell]$ cat ping07.sh
#!/bin/bash

if [ $# -eq 0 ];then
echo "usage: `basename $0` filename"
exit
fi

if [ ! -f $1 ];then
echo "filename error"
exit
fi
for ip in `cat $1`
do
ping -c1 $ip
done
[hadoop@master shell]$ sh ping07.sh
usage: ping07.sh filename
[hadoop@master shell]$ sh ping07.sh ip.txt

1.3变量的赋值

1.3.1显式赋值

在Shell中,当第一次使用某变量名时,实际上就已经给变量赋值了。显式赋值的
格式为”变量名=变量值”。为了避免歧义,显式赋值时__禁止在等号两边添加空格__,
这跟常见的编程语言有所不同。

1
a=3
  • 变量缺省为字符串类型
  • 变量值中有空格需要使用引号
  • 使用变量值进行赋值 name=“welcome to $place”

1.3.2从键盘赋值

1
2
3
4
read -p "Please enter a ip:" ip
Please enter a ip:1.1.1.1
echo $ip
1.1.1.1

1.3.3使用位置变量赋值

1
2
3
4
cat test.sh
echo $1 $2
sh test.sh hello world
hello world

1.3.4利用命令替换进行赋值

1
2
3
4
today=`date +%F`
echo today
2021-10-2
touch `date +%F`_file.txt

双引号弱引用,单引号为强引用

1
2
3
4
5
6
7
8
9
10
[hadoop@master shell]$ cat ping04.sh 
#!/bin/bash
host=www.baidu.com
ping -c1 $host &>/dev/null
if [ $? -eq 0 ]
then
echo "network to $host is ok"
else
echo "bad network to $host"
fi

1.4变量的运算

1.4.1.expr数值运算命令

1
2
3
4
5
6
echo 1 + 3
1 + 3
expr 1 + 3
4
res = `expr $name1 \* $name2`
echo $res
  • 在使用expr时,需要注意运算符及用于计算的数字两边必须有空格,否则会执行失败。
  • expr 支持乘法运算,在使用乘号 * 时必须用反斜杠转义,即 \*

1.4.2.“$(())”或“[]”数值运算命令

  • 双小括号 “$(())” 的作用是进行整数运算和数值比较,格式为“ ((表达式))”
  • 操作数、运算符两侧可以有空格
  • 括号内 $ 符合可省略
1
2
3
4
5
6
7
8
num1=10
num2=20
sum=$((num1+num2))
echo $sum
30
sum=$[ num1+num2 ]
echo $sum
#可以使用加减乘除幂

1.4.3.let数值运算命令

  • let数值符号可以直接进行计算,不需要使用 $ 符号。
  • let运算命令的语法格式为:let 赋值表达式
1
2
3
4
5
let num=1+2
echo $num
3
#调试模式
bash -vx test.sh

1.4.4Shell小数运算

  • bc是Unix/Linux下的计算器,它还可以作为命令进行小数运算。
1
2
3
4
echo "2^4"|bc
16
echo "scale=2;6/4"|bc
1.50

1.5 变量的删除和替换

Linux提供了一些可以直接对变量进行操作的符号。通过这些符号,变量中的部分内容可以被删除、替换和替代。在Shell变量中,变量的删除、替换和替代也是非常重要的。通过简单的操作修改变量,可以减少代码的行数并提高可读性。

1.5.1 变量的删除

  • 变量删除的操作方式,如表所示。
操作 描述
${变量名#关键字符} 如果变量内容从头开始的数据符合“关键字符”,则将符合的最短数据删除
${变量名##关键字符} 如果变量内容从头开始的数据符合“关键字符”,则将符合的最长数据删除
${变量名%关键字符} 如果变量内容从尾开始的数据符合“关键字符”,则将符合的最短数据删除
${变量名%%关键字符} 如果变量内容从尾开始的数据符合“关键字符”,则将符合的最长数据删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@hdp-1 ~]# url=www.bing.com
[root@hdp-1 ~]# echo ${url}
www.bing.com
[root@hdp-1 ~]# echo ${#url}
12
[root@hdp-1 ~]# echo ${url}
www.bing.com
[root@hdp-1 ~]# echo ${url#*.}
bing.com
[root@hdp-1 ~]# echo ${url##*.}
com
[root@hdp-1 ~]# echo ${url%.*}
www.bing
[root@hdp-1 ~]# echo ${url%%.*}
  • 索引和切片
1
2
3
4
5
6
7
8
[root@hdp-1 ~]# echo ${url:0:5}
www.b
[root@hdp-1 ~]# echo ${url:5:5}
ing.c
[root@hdp-1 ~]# echo ${url:5:}

[root@hdp-1 ~]# echo ${url:5}
ing.com

1.5.2 变量的替换

操作 描述
${变量名/旧字符串/新字符串} 表示若变量内容符和【旧字符串】则第一个【旧字符串】会被【新字符串】替换
${变量名//旧字符串/新字符串} 表示若变量内容符和【旧字符串】则全部的【旧字符串】会被【新字符串】替换
1
2
3
4
5
6
7
8
[root@hdp-1 ~]# echo ${url/bing/baidu}
www.baidu.com
[root@hdp-1 ~]# echo ${url/b/B}
www.Bing.com
[root@hdp-1 ~]# echo ${url/w/W}
Www.bing.com
[root@hdp-1 ~]# echo ${url//w/W}
WWW.bing.com

1.5.3变量的替代

  • 给Shell变量设置默认值的格式为”${变量名-新的变量名}”,如果变量名没有被赋值,会使用”新的变量值”替代,如果变量已被赋值(包括空值),则该值不会被替代。
  • 变量替代常用于为变量设置缺省值。例如,在连接数据库时,需要使用端口,这个端口可以是预先设置的具体端口,也可以是用户输入的端口。假如用户没有输入具体的端口号,脚本中就使用预先设置的端口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@hdp-1 ~]# unset url
[root@hdp-1 ~]# echo ${url}

[root@hdp-1 ~]# echo ${url-www.heuet.edu.cn}
www.heuet.edu.cn

[root@hdp-1 ~]# host=hadoop
[root@hdp-1 ~]# echo ${host-www.heuet.edu.cn}
hadoop
[root@hdp-1 ~]# var=
[root@hdp-1 ~]# echo ${var-www.heuet.edu.cn}

[root@hdp-1 ~]# unset var1
[root@hdp-1 ~]# var2=
[root@hdp-1 ~]# var3=333
[root@hdp-1 ~]# echo ${var1-111}
111
[root@hdp-1 ~]# echo ${var1:-111}
111
[root@hdp-1 ~]# echo ${var2:-111}
111
[root@hdp-1 ~]# echo ${var3:-111}
333
上一篇:
Nmap常用命令总结
下一篇:
Linux Shell循环结构
本文目录
本文目录