Linux基础bash shell基础

Posted 上海老男孩教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux基础bash shell基础相关的知识,希望对你有一定的参考价值。

  ✦ ✦ ✦ ✦ ✦

【Linux基础】bash shell基础

目录Bash shell基础一 介绍二 变量三 引号对变量的影响四 变量作用域五 影响bash shell的文件六 元字符七 Bash SHELL基础


【Linux基础】bash shell基础

                ✦ ✦ ✦ ✦ ✦

Bash shell基础

一 介绍

类比:

  • shell语法《==============》python语法

  • bash解释器《============》python解释器

  • 平台 《=================》平台


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

二 变量

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

[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"
hello egon

应用示例

[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

四 变量作用域

环境变量: 在当前shell及子shell生效!

自定义变量: 仅在当前shell生效!

[root@localhost ~]# x=1
[root@localhost ~]# export x
[root@localhost ~]# bash
[root@localhost ~]# echo $x
1

set  查看所有变量(包括自定变量和环境变量)env 查看环境变量

系统环境变量配置文件:(系统定义的)

  • 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中的内容

影响bash shell的其它文件,bash登录和欢迎信息

/etc/motd    登录后显示的信息
/etc/issue     登录前显示的信息(本地登录)
/etc/issue.net   登录前显示的信息(网络登录)

示例

[root@localhost ~]# cat /etc/motd 
+--------------------------------------------+
|                                            |
|    你当前登录的是支付业务后台数据库服务    |
|    请不要删库                              |
|                                            |
+--------------------------------------------+

六 元字符

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  # .txt前只有一个字符,但是非数字
    /test/a.txt
    [root@localhost ~]# ls /test/[^0-9].txt  # .txt前只有一个字符,但是非数字
    /test/a.txt


  • 5、@无特殊意义

  • 6、#注释

  • 4、$取变量值

  • [root@localhost ~]# x=1
    [root@localhost ~]# echo $x
    1

    5、%、-、+运算符

    # 数学运算
    # 1、bc是比较常用的linux计算工具了,而且支持浮点运算:
    [root@localhost ~]# res=`echo 1+1 | bc`
    [root@localhost ~]# echo $res
    2

    [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
    .83

    # 2、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
    2

    # 3、$(()) 同expr,不支持浮点数运算
    [root@localhost ~]# echo $((1+1))
    2
    [root@localhost ~]# echo $((1.0+2.0))
    -bash: 1.0+2.0: 语法错误: 无效的算术运算符 (错误符号是 ".0+2.0"
               

    #4、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"
  • 6、^同!一样

  • 7、*任意多个字符

  • [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
    1.txt  2.txt  a1c.txt  aaa.txt  aa.txt

    8、()在子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
  • 9、_下划线:无特殊意义,可以用于名字的声明

  • 10、=赋值,判断相等性

  • [root@localhost ~]# [ 1 = 1 ]  # 条件1 = 1的左右两边必须有空格
    [root@localhost ~]# echo $?    # 判断上一条命令的结果是否为真,0=》true
    0


    11、|管道:把一个进程的处理结果传递给另外一个进程

    [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
    1.txt  2.txt  3.txt

    12、转义特殊字符

    [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

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

    [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 $?

    14、引号

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

    [root@localhost ~]# x=111
    [root@localhost ~]# echo "$x"
    111
    [root@localhost ~]# echo '$x'
    $x
    [roo

    15、;与&&与||连接多条命令

    [root@localhost home]# gagaga;ls  # 不论前一条命令运行成功与否,都会执行后续命令
    bash: gagaga: 未找到命令...
    egon
    [root@localhost home]# gagaga && ls  # 只有前一条命令执行成功,才会执行后续命令
    bash: gagaga: 未找到命令...
           
    [root@localhost home]# ls /test || mkdir /test  # 前一条命令执行不成功才会执行后续命令
    0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
  • 16、/路径分隔符

    17、{}包含

  • [root@localhost home]# touch /test/{0..9}.txt
    [root@localhost home]# ls /test/
    0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt

    18、&后台运行

    [root@localhost home]# echo "hello";sleep 3;echo "world" &

    19、重定向

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

    > 覆盖  >> 追加
    [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:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

                           
    [root@localhost home]# dd if=/dev/zero of=/a.txt bs=1M count=10
    记录了10+0 的读入
    记录了10+0 的写出
    10485760字节(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 秒,518 MB/

    [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
    -rw-r--r--. 1 root root 10485760 8  13 16:03 /b.txt

    20、?任意一个字符

    [root@localhost ~]# ls ??.txt
    aa.txt
    [root@localhost ~]# ls a?c.txt
    a1c.txt
    [root@localhost ~]# rm -rf *.txt

     21、范围中的任意一个字符 [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]*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb1

七 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 for1.sh 
[root@localhost ~]# cat for1.sh
#!/bin/bash
for i in {1..5}
do
   echo $i
done
[root@localhost ~]# source for1.sh
1
2
3
4
5

例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 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!!!
......

练习

1、编写脚本创建100个用户并设置好密码,用户名为user1,user2,user3...

提示非交互式修改密码: echo 123 |passwd user1 --stdin
【Linux基础】bash shell基础
END



欢迎扫码领取 0元试听课



以上是关于Linux基础bash shell基础的主要内容,如果未能解决你的问题,请参考以下文章

linux学习19 shell脚本基础-bash脚本编程基础及配置文件

Linux基础bash shell基础

Linux Bash-脚本基础

Linux操作系统基础解析之——Bash(Shell)基础知识

[Linux]基础bash shell命令

Linux之基础bash shell命令