bash shell基础

Bash shell基础
一 介绍

类比:
shell语法《==============》python语法
bash解释器《============》python解释器
平台 《=================》平台

shell是一门解释型、弱类型、动态语言

二 变量
登录用户即进入交互式环境,与python的交互式环境都是一回事

应用示例

[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 is alive"
else
    echo "host $ip is down!!!"
fi
[root@localhost ~]# chmod +x heartbeat.sh 
[root@localhost ~]# ./heartbeat.sh 
host 192.168.11.20 is down!!!

三 引号对变量的影响

双引号=》弱引用
[root@localhost ~]# name=egon
[root@localhost ~]# echo "hello $name"

双引号=》强引用
[root@localhost ~]# echo 'hello $name'
hello $name

反引号=》取结果
[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

变量值包含空格时,需要加上双引号包含
[root@localhost ~]# msg="hello egon"
[root@localhost ~]# echo $msg
hello egon

结论:双引号可以解析变量,但是单引号则不行。

四 变量作用域

set 查看所有变量(包括自定变量和环境变量) env 查看环境变量
环境变量: 在当前shell及子shell生效!
自定义变量: 仅在当前shell生效!
[root@localhost ~]# x=1
[root@localhost ~]# export x
[root@localhost ~]# bash
[root@localhost ~]# echo $x
1
系统环境变量配置文件:(系统定义的)
1、/etc/profile
2、/etc/bashrc
3、~/.bashrc
4、~/.bash_profile
系统环境变量
[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
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

五 影响bash shell的文件

系统环境变量配置文件:(系统定义的)
1、/etc/profile
2、/etc/bashrc
3、~/.bashrc
4、~/.bash_profile
上述四个文件在登录shell即su - egon时的执行顺序是
login shell:        
    1. /etc/profile         系统级别配置文件
    2. ~/.bash_profile      用户级别配置文件 (用户自定义的环境变量) 
    3. ~/.bashrc            用户级 (定义别名)
    4. /etc/bashrc          系统级

在非登录shell即su egon时,执行的文件只有两个,顺序为
non-login shell: 
    1. ~/.bashrc            用户级
    2. /etc/bashrc          系统级

Ps:
1、vim /home/user1/.bash_history -------每次登陆用户的操作都记录其中
2、su - user1进行操作然后退出,查看该文件内容
3、vim /home/user1/.bash_logout --------添加一条  
4、>/home/user1/.bash_history这样每次退出用户后都会自动清空~/.bash_history中的内容  

六 元字符

shell语法中的特殊字符
1、`` 与$():取命令的结果
[root@localhost ~]# echo `pwd`
[root@localhost ~]# echo $(pwd)
不一样的地方在于$()可以嵌套,而``不能嵌套
[root@localhost ~]# echo $(ls $(pwd))

2、~家目录

3、.与..

4、!取反
[root@localhost ~]# find /test ! -name 1.txt

5、@无特殊意义

6、#注释

7、$取变量值
[root@localhost ~]# echo $x

8、%、-、+运算符
  # 数学运算
  # 1、bc是比较常用的linux计算工具了,而且支持浮点运算:
   [root@localhost ~]# res=`echo "scale=2;5.0/6.0"|bc`
  # 2、expr不支持浮点数计算。而且要注意数字与运算符中的空格
  [root@localhost ~]# res=`expr 1+1` # 注意:要有空格
  # 3、$(()) 同expr,不支持浮点数运算
   [root@localhost ~]# echo $((1+1))
  #4、let 不支持浮点数运算,而且不支持直接输出,只能赋值
  [root@localhost ~]# let res=50/5
  [root@localhost ~]# echo $res

9、^同!一样

10、*任意多个字符

11、()在子shell中执行
[root@localhost ~]# (umask 066;touch a.txt) # umask的设置只在子shell中有效

12、_下划线:无特殊意义,可以用于名字的声明

13、=赋值,判断相等性
[root@localhost ~]# [ 1 = 1 ] # 条件1 = 1的左右两边必须有空格

14、|管道:把一个进程的处理结果传递给另外一个进程
[root@localhost ~]# ps aux | grep python
xargs参数传递,把上一个命令的结果作为下一个命令的参数
[root@localhost ~]# find /home/ -type d -name "test*" |xargs ls

15、\转义特殊字符
[root@localhost ~]# echo $RMB # 默认会当成变量
​[root@localhost ~]# echo '$RMB' # 取消特殊意义
[root@localhost ~]# echo \$RMB # 取消特殊意义

16、[]条件测试,后续会详细介绍

17、引号
'' 强引用(在单引号中都视为普通字符)
" " 弱引用 (在双引号中保留变量)

18、;与&&与||连接多条命令
# ; 不论前一条命令运行成功与否,都会执行后续命令
# && 只有前一条命令执行成功,才会执行后续命令
# || 前一条命令执行不成功才会执行后续命令

19、/路径分隔符

20、{}包含

21、&后台运行
[root@localhost home]# echo "hello";sleep 3;echo "world" &

22、重定向
> >> 输出重定向
< << 输入重定向

23、?任意一个字符
[root@localhost ~]# ls a?c.txt

24、范围中的任意一个字符 [12] [ac] [a-z] [0-9]
[root@localhost ~]# ls a[A-Z]c # 不区分大小写

七 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 
egon
tom
jack
例3
[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 is up"
    else
        echo "$i is down!!!"
    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!!!
......

posted @ 2021-07-12 17:30  小丶凡  阅读(41)  评论(0编辑  收藏  举报
1