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个参数,10 以 上 需 要 用 括 起 来 , 如 10以上需要用{}括起来,如 1 0 以 上 需 要 用 括 起 来 , 如 {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中,当第一次使用某变量名时,实际上就已经给变量赋值了。显式赋值的
格式为”变量名=变量值”。为了避免歧义,显式赋值时__禁止在等号两边添加空格__,
这跟常见的编程语言有所不同。
变量缺省为字符串类型
变量值中有空格需要使用引号
使用变量值进行赋值 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