1、shell语言的特点
SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;
作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、
建立文件并以并行的方式协调各个程序的运行。
因此,对于用户来说,shell是最重要的实用程序,
深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
2、shell的多种执行方式
准备测试脚本
[root@localhost tmp]#vim 1.sh
echo "hello 2020"
read -p "请输入您的姓名:" name
echo "哈哈 $name 是大笨蛋"
执行1:
bash 1.sh
执行2:
sh 1.sh
执行3:
. 1.sh
执行4:
source 1.sh
多执行方式的区别
1和2的方式是子shell,3和4的方式是本shell。
准备测试环境
[root@localhost ~]# vim bash.sh
#!/usr/bin/bash
cd /home/
ls
使用 . bash 执行观察出路径改变了。说明影响的是当前。
使用bash 执行时,目录没有发生改变。
用固定的字符串去表示不固定的内容,便于修改
1、自定义变量
用户自定义变量是最常用的变量类型,其特点是变量名和变量值都是由用户自由定义的。
定义变量
name=xiaoming //定义变量
$name //引用变量
echo $name //查看变量
变量调用
当我们需要提取变量中的内容时,需要在变量名之前加入"$"符号。那么最简单的变量调用就是通过 echo 命令输出变量的值。命令如下:
echo $变量名
变量的定义就是这么简单,但是如果不遵守变量定义规则,就会报错。比如:
#变量名不能以数字开头
#等号左右两侧不能有空格
#变量的值如果有空格,必须用引号包含
变量删除
unset 变量名
unset name
echo $name
输出为空
使用变量前:
[root@localhost ~]vim ping.sh
ping -c1 192.168.100.10 &> /dev/null && echo 192.168.100.10up || echo 192.168.100.10down
[root@localhost ~]#chmod +x ping.sh //授权版本
[root@localhost ~]#./ping.sh //执行脚本
注释: &&和||是三目表达式
&& 前面的命令成功。执行后面的命令
||前面的命令失败。执行后面的命令
使用变量后:
[root@localhost ~]vim ping.sh
#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null && echo $ip up || echo "$ip down"
[root@localhost ~]# chmod +x ping.sh
[root@localhost ~]# ./ping.sh
交互定义变量
read从键盘读入变量值:
read 变量名
read -p "请输入您测试的IP地址:" ip //-p 显示出来“请输入您测试的IP地址:”
ping -c1 $ip &>/dev/null && echo " $ip up" || echo "$ip
down"
注意事项:3种引号
“”双引号:弱引用
eg:[root@localhost ~]# schoo=1000 phone 错误示范,shell把空格识别做命令分隔符。
bash: phone: 未找到命令[root@localhost ~]# schoo="1000 phone" 正确示范,变量值中的空格,被转义为一个普通符号
[root@localhost ~]# echo $schoo
1000 phone 执行成功。
变量值用双引号圈起来就成为了一个整体,空格就失去了含义。只是将字母与字母分隔开。
‘’单引号:强引用
[root@localhost ~]# schoo='$schoo 666'
单引号,转义一切符号
[root@localhost ~]# echo $schoo
$schoo 666 $也被转义了。一切都被转义了。
被单引号圈起来的变量值里面的一切符号仅仅只是一个符号。
``反引号:优先执行
[root@localhost ~]# schoo=`date`
反引号是优先执行。先执行date的命令,再执行定义变量。
[root@localhost ~]# echo $schoo
2020年 05月 06日 星期三 14:57:13 CST
所以看到变量的结果,是时间
注意:
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
起变量名,请使用五个字母以上。
2、环境变量
定义环境变量
方法一:export back_dir2=/home/backup
方法二:export back_dir1 ,将自定义变量转换成环境变量。
引用环境变量
$变量名或${变量名}
查看环境变量
echo $变量名 或 env eg:env | grep back_dir1
取消环境变量
unset 变量名
变量作用的范围
在当前shell和子shell有效
ps:如果想让变量应用于所有的shell中,需要将变量写到开机启动的配置文件中(/etc/profile)
3、位置变量和预定义变量
位置变量
$1 $2 $3 $4 $5 $6...
vim test.sh
#!/usr/bin/bash
echo "第2个位置参数是$2"
echo "第1个位置参数是$1"
echo "第4个位置参数是$4"
[root@localhost ~]# bash test.sh 1 2 3 4 //运行test.sh 后面要跟上参数
第2个位置参数是2
第1个位置参数是1
第4个位置参数是4
预定义变量
预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
1、整数运算
① expr
num=1;num=2;expr $num1 + $num2
ps: + 加 - 减 \* 乘 /除 %取余 (*是任意字符 使用\转义一下)
② $(())
echo $(($num1+$num2))
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
echo $((2**3)) //(幂)2的3次方
sum=$((1+2)); echo $sum
③ $[]
echo $[5+2]
④ let
let sum=2+3; echo $sum
//sum的值下次也可以调用
2、小数运算
yum -y install bc //bc是一个交互运算器,需要下载
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc //scale=2 保留小数点后面两位
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" |python