@解释器Bash shell基础
原创
©著作权归作者所有:来自51CTO博客作者小何Q才露煎煎饺的原创作品,请联系作者获取转载授权,否则将追究法律责任
Bash shell基础
文章目录
一.介绍
类比:
shell 语法=========python语法
bash解释器==========Python解释器
#shell是一门解释型,弱类型,动态语言
二、变量
1、什么是变量
量:记录下的事物的状态
变:事物的状态是可以发生变的
#变量是一种存取内存的机制
2、为何要用变量
#为了让计算机能够像人一样记下事物的状态,记不是目的,目的是为了以后取出来用
#并且事物的状态是可以改变的
3、如何用变量
[root@localhost ~]# x=1
[root@localhost ~]# x=2
[root@localhost ~]# echo $x
2
[root@localhost ~]# name1=egon
[root@localhost ~]# echo $name1
egon
[root@localhost ~]# echo ${name1}
egon
[root@localhost ~]# unset name1
[root@localhost ~]# echo $name1
[root@localhost ~]#
[root@localhost ~]# domain=www.baidu.com
[root@localhost ~]# ping -c1 $domain
[root@localhost ~]# name=egon
[root@localhost ~]# echo "hello $name"
示列:
[root@localhost ~]# vim heartbeat.sh
[root@localhost ~]# cat heartbeat.sh
#!/bin/bash
ip=192.168.11.20
ping -c1 $ip &>/dev/null
if [ $? = 0 ];then
echo "host $ip
else
echo "host $ip
fi
[root@localhost ~]# chmod +x heartbeat.sh
[root@localhost ~]# ./heartbeat.sh
host 192.168.11.20 is down!!!
三、引号对变量的影响
1.双引号:表示弱引号
[root@localhost ~]# name=egon
[root@localhost ~]# echo "hello $name"
2.双引号:表示强引号
[root@localhost ~]# echo 'hello $name'
hello $name
3.反引号:表示只取结果
[root@localhost ~]# today=`date +%F`
[root@localhost ~]# echo $today
2020-08-11
[root@localhost ~]# today=$(date +%H:%M:%S)
[root@localhost ~]# echo $today
22:05:55
示列:
[root@localhost ~]# tar czf `date +%F`_bak.tar.gz /tmp
4.注意:对于变量包含空格时,应需加上双引号包含
[root@localhost ~]# msg="hello egon"
[root@localhost ~]# echo $msg
四.变量的作用域
1.环境变量:在当前shell及子shell生效
2.自定义变量: 仅在当前shell中生效
[root@localhost ~]# x=1
[root@localhost ~]# export x
[root@localhost ~]# bash
[root@localhost ~]# echo $x
set 查看所有变量(包含自定义变量和环境变量)
env
3.系统环境变量所需要配置的文件(系统定义的)
̵/etc/profile
/etc/bashrc
/.bashrc
/.bash_profile
5.系统环境变量
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# echo $HOSTNAME
localhost.localdomain
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $HISTSIZE
5
[root@localhost ~]# echo $MAIL
/var/spool/mail/root
[root@localhost ~]# echo $PATH
五.影响bash shell的一些文件
1.系统环境变量配置文件:
̵/etc/profile
/etc/bashrc
/.bashrc
/.bash_profile
#以上系统配置文件登录shell执行顺序:su egon
login shell:
1. /etc/profile #系统级别配置文件
2. ~/.bash_profile #用户级别的配置文件(用户定义的环境变量)
3. ~/.bashrc #用户级别(定义别名)
4. /etc/bashrc #系统级
non-login shell:
1. /.bashrc #用户级
2. /etc/bashrc #系统级
#影响bash shell的其他文件,bash登录界面和欢迎界面
/etc/motd #登录后显示的信息
/etc/issue #登录前显示的信息(本地)
/etc/issue.net #登录前显示显示的信息(网络登)
[root@localhost ~]# cat /etc/motd
+--------------------------------------------+
| |
| 登录时显示的设置内容
|
| |
六. 元字符
1.shell语法中的特殊字符:
1>. ``与 ( ):取值的结果
[root@localhost ~]# echo `pwd`
/root
[root@localhost ~]# echo $(pwd)
/root
区别:$()可以嵌套,而``不能嵌套
[root@localhost ~]# echo $(ls $(pwd))
2>.~ 表示家目录
3>. . 与…
4>. !取反
root@localhost ~]# touch /test/{1.txt,2.txt,a.txt,aaa_bbb.txt}
[root@localhost ~]# find /test ! -name 1.txt
/test
/test/2.txt
/test/a.txt
/test/aaa_bbb.txt
[root@localhost ~]# ls /test/[!0-9].txt
/test/a.txt
[root@localhost# ls /test/[^0-9].txt
5>.@无特殊意义
6>.#注释
7>.$取值变量
[root@localhost ~]# x=1
[root@localhost ~]# echo $x
8>.% 、-、+、用算符
#bc是常用的linux计算工具,支持浮点型
[root@localhost ~]# res=`echo 1+1 | bc`
[root@localhost ~]# echo $res
[root@localhost ~]# res=`echo 10 % 3 | bc`
[root@localhost ~]# echo $res
1
[root@localhost ~]# res=`echo 1.2+1.3|bc`
[root@localhost ~]# echo $res
2.5
[root@localhost ~]# res=`echo 5.0+3.0|bc`
[root@localhost ~]# echo $res
8.0
[root@localhost ~]# res=`echo "scale=2;5.0/3.0"|bc`
[root@localhost ~]# echo $res
1.66
[root@localhost ~]# res=`echo "scale=2;5.0/6.0"|bc`
[root@localhost ~]# echo $res
#expr不支持浮点型计算,且注意数字与运算符中的空格
[root@localhost ~]# res=`expr 5 / 3`
[root@localhost ~]# echo $res
1
[root@localhost ~]# res=`expr 1+1` #注意要有空格
[root@localhost ~]# echo $res
1+1
[root@localhost ~]# res=`expr 1 + 1`
[root@localhost ~]# echo $res
#$,(())同expr,不支持浮点型运算
[root@localhost ~]# echo $((1+1))
2
[root@localhost ~]# echo $((1.0+2.0))
-bash: 1.0+2.0: 语法错误:无效的算数运算符(".0+2.0")
# let 不支持浮点数运算,而且不支持直接输出,只能赋值
[root@localhost ~]# let res=1+1
[root@localhost ~]# echo $res
2
[root@localhost ~]#
[root@localhost ~]# let res=50/5
[root@localhost ~]# echo $res
10
[root@localhost ~]# let c=1.3*3
-bash: let: c=1.3*3: 语法错误:无效的算数运算符( ".3*3")
9>. ^ 同!一样
10>. *表示任意多个字符
[root@localhost ~]# touch 1.txt 2.txt aa.txt aaa.txt
[root@localhost ~]# rm -rf *.txt
[root@localhost ~]# touch 1.txt 2.txt aa.txt aaa.txt a1c.txt
[root@localhost ~]# ls *.txt
11>.()表示在子shell中执行
[root@localhost ~]# (x=1)
[root@localhost ~]# echo $x
ଫአ
[root@localhost ~]# (umask 066;touch a.txt) # umask的设置只在子shell中有效
[root@localhost ~]# ll a.txt
-rw-------. 1 root root 0 8์月 13 15:22 a.txt
[root@localhost ~]# touch b.txt
[root@localhost ~]# ll b.txt
-rw-r--r--. 1 root root 0 8์月 13 15:23 b.txt
12>. _下划线:无特殊意义。可用于名字的声明
13>.= 等号:赋值,判断相等性
[root@localhost ~]# [ 1 = 1 ] #条件1 = 1的左右两边必须有空格
[root@localhost ~]# echo $? # 判断上一条命令结果是否为真0=̾true
14>.|管道:把一个进程的结果传递给另一个进程
[root@localhost ~]# ps aux | grep python
xargs参数传递
[root@localhost ~]# find /home/ -type d -name "test*" |xargs ls
1.txt 2.txt 3.txt
[root@localhost ~]# ls /home/test
15>.\转移特殊字符
[root@localhost ~]# mkdir a\ b.txt
[root@localhost ~]# ll
总用量 0
drwxr-xr-x. 2 root root 6 8์ 13 15:35 a b.txt
[root@localhost ~]# echo $RMB #默认会当成变量
[root@localhost ~]# echo '$RMB' #取消特殊意义
$RMB
[root@localhost ~]# echo \$RMB #取消特殊意义
$RMB
16>.[ ]条件测试
[root@localhost ~]# name="egon"
[root@localhost ~]# [ $name = "egon" ];echo $?
0
[root@localhost ~]# name="adf"
[root@localhost ~]# [ $name = "egon" ];echo $?
1
[root@localhost ~]# [ -d /test ];echo $?
17>.’'引号
'' #表示强引用
" " #弱引用
[root@localhost ~]# x=111
[root@localhost ~]# echo "$x"
111
[root@localhost ~]# echo '$x'
$x
18>. ; 与&& 与 || 连接多条命名
[root@localhost home]# gagaga;ls # 无论前一条命令执行成功与否,都会执行后续命令
bash: gagaga: #未找到命令
egon
[root@localhost home]# gagaga && ls #只有前面一条命令执行成功后,才会执行后面一条命令
bash: gagaga: #未找到命令
[root@localhost home]# ls /test || mkdir /test #前面一条命令执行不成功,才会执行后面一条命令
19>./路径分隔符
20>. { }:指示包含
[root@localhost home]# touch /test/{0..9}.txt
[root@localhost home]# ls /test/
21>.&表示后台运行
[root@localhost home]# echo "hello";sleep 3;echo "world" &
22>.重定向
> >> #输出重定向
< << #输入重定向
> #覆盖
>> #追加
[root@localhost home]# cat >> a.txt << EOF
> 111
> 222
> 333
> EOF
0#标准输入
1#标准正确输出
2#标准错误输出
&#标准正确和错误输出
[root@localhost home]# pwd 1>a.txt
[root@localhost home]# cat a.txt
/home
[root@localhost home]# gagag 2>a.txt
[root@localhost home]# cat a.txt
bash: gagag: #命令未找到
[root@localhost home]# gagaga &>/dev/null
< << #输出重定向
[root@localhost ~]# mysql -uroot -p123 < bbs.sql
[root@localhost home]# grep root < /etc/passwd
[root@localhost home]# dd if=/dev/zero of=/a.txt bs=1M count=10
#记录了10+0 的读入
#记录了10+0 的写出
1048576字节(10 MB)҅已复制,0.024387 秒,430 MB/秒
[root@localhost home]# dd </dev/zero >/b.txt bs=1M count=10
#记录了10+0 的读入
#记录了10+0 的写出
10485760字节(10 MB)҅已复制,0.0202365 秒,518MB/秒
[root@localhost home]# ll /a.txt
-rw-r--r--. 1 root root 10485760 8์ 13 16:02 /a.txt
[root@localhost home]# ll /b.txt
23>.?任意一个字符
[root@localhost ~]# ls ??.txt
aa.txt
[root@localhost ~]# ls a?c.txt
a1c.txt
[root@localhost ~]# rm -rf *.txt
24.范围中的任意一个字符 [12] [ac] [a-z] [0-9]
[root@localhost ~]# touch a1c a2c axc aXc axd
[root@localhost ~]# ls a?c
a1c a2c axc aXc
[root@localhost ~]# ls a[1x]c
a1c axc
[root@localhost ~]# ls a[a-z]c
axc aXc
[root@localhost ~]# ls a[A-Z]c # ӧړ܄य़ੜٟ
axc aXc
[root@localhost ~]# ls a[x]c
axc
[root@localhost ~]# ls a[X]c
aXc
[root@localhost ~]# ls a[0-9]c
a1c a2c
[root@localhost ~]# ls /dev/sd[a-z]*
七 运行shell程序的两种方式
1、交互式环境
2、把shell命令写入文件中,该文件称之为脚本文件
bash 脚本文件的路径
#运行shell脚本经历的三个阶段
(1)先启动bash解释器
(2)bash解释器会将脚本文件的内容从硬盘读入内存
(3)bash解释器会解释执行刚刚读入内存的代码,识别语法
chmod +x nginx_install.sh
./nginx_install.txt # 开启一个子shell来运行程序
八. Bash SHELL 基础
1.案列:
[root@localhost ~]# vim if.sh
[root@localhost ~]# cat if.sh
#!/usr/bin/env bash
domain="www.baidu.com"
ping -c2 $domain &>/dev/null
if [ $? = 0 ];then
echo "network is ok"
else
echo "network is down!!!"
fi
[root@localhost ~]# chmod +x if.sh
[root@localhost ~]# ./if.sh
network is ok
2.案列:
[root@localhost ~]# vim for.sh
[root@localhost ~]# ll for.sh
-rw-r--r--. 1 root root 61 8์ 13 16:17 for.sh
[root@localhost ~]# . for.sh
3.案列:
[root@localhost ~]# vim for1.sh
[root@localhost ~]# cat for1.sh
#!/bin/bash
for i in {1..5}
do
echo $i
done
[root@localhost ~]# source for1.sh
4.案列:
[root@localhost ~]# vim for2.sh
[root@localhost ~]# cat for2.sh
#!/bin/bash
for i in {1..10}
do
ip=192.168.12.$i
ping -c1 $ip &>/dev/null
if [ $? = 0 ];then
echo "$i
else
echo "$i
fi
done
[root@localhost ~]# vim for2.sh
[root@localhost ~]# source for2.sh
192.168.12.1 is up
192.168.12.2 is down!!!
192.168.12.3 is up
192.168.12.4 is down!!!
......