bash编程基础

    1、read 简介

    2、bash变量

            2.1环境变量

            2.2只读变量

    3、bash运算符

            3.1特殊字符

            3.2数值运算符

            3.3逻辑判断符

    4、case函数

    5、补充

read read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]

描述: 接受标准输入,将标准输入中读取数值,分配给变脸
常用选项

-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d ‘字符’ 输入结束符

示例:

[root@centos7 shell]# read -p "Enter a filename:"
Enter a filename:admin

管道传递参数,实现read参数键入

[root@centos7 shell]# echo 1 2 3 | read x y z 
[root@centos7 shell]# echo $x  #默认管道执行时都要打开一个子shell,导致数值传到子shell中,所以read并没有收到该值

[root@centos7 shell]# echo 1 2  3|{ read x y z ; echo $x $y $z; } #{}或() 直接在子shell中打印出该值
    1 2 3
[root@centos7 shell]# echo 11 21  31 | ( read x y z ; echo $x $y $z;  )              
    11 21 31

变量

export 环境变量

      描述: 仅在当前进程及子进程子子进程中生效的变量
普通变量在父子进程之间没有继承关系
栗子:

[root@CentOS8 ~]# name=admmin
[root@CentOS8 ~]# echo $BASHPID
21376
[root@CentOS8 ~]# bash
[root@CentOS8 ~]# echo $name

[root@CentOS8 ~]# echo $BASHPID
21402

      只有定义了环境变量才可以继承export PATH;即子进程继承父进程的变量;从上到小传递变量,中间可以修改,只影响当前变量及其下级子进程,但不影响父进程中的原变量
栗子:

[root@CentOS8 ~]# export name=admin  #当前进程父进程
[root@CentOS8 ~]# echo $BASHPID
21376
[root@CentOS8 ~]# bash    #一级
[root@CentOS8 ~]# echo $name
admin
[root@CentOS8 ~]# echo $BASHPID
21445
[root@CentOS8 ~]# bash  #二级
[root@CentOS8 ~]# echo $name
admin
[root@CentOS8 ~]# echo $BASHPID
21463
[root@CentOS8 ~]# bash #三级修改了变量
[root@CentOS8 ~]# export name=administrator
[root@CentOS8 ~]# echo $name
administrator
[root@CentOS8 ~]# echo $BASHPID
21489
[root@CentOS8 ~]# bash #四级
[root@CentOS8 ~]# echo $name
administrator
[root@CentOS8 ~]# echo $BASHPID
21507
[root@CentOS8 ~]# exit
exit
[root@CentOS8 ~]# exit
exit
[root@CentOS8 ~]# exit
exit
[root@CentOS8 ~]# exit  退回到父
exit
[root@CentOS8 ~]# echo $BASHPID
21376
[root@CentOS8 ~]# echo $name #原变量任然不变
admin

可通过#pstree -p 查看关系树得当前进程属性

─sshd(912)───sshd(21349)───sshd(21375)─┬─bash(21376)───bash(21445)───bash(21463)───bash(21489)───bash(21507)

说明 :

 # echo $BASHEPID  查看当进程号
 # echo $PPID      查看父进程编号
 # env             查看系统定义的所有环境变量
 # unset EXPORTNAME 取消所有环境变量
 # pstree -p       查看/bin/bahs关系进程树
 # export EXPORTNAME 定义环境变量

readonly name

描述: 只读变量(常量)仅对当前shell有效,定义后不可更改、删除,推出当前shell后失效
栗子:

[root@CentOS8 ~]# readonly NAME=hjq
[root@CentOS8 ~]# echo $NAME
hjq
[root@CentOS8 ~]# NAME=hjj
-bash: NAME: readonly variable
[root@CentOS8 ~]# NAME=hjl
-bash: NAME: readonly variable
[root@CentOS8 ~]# unset NAME
-bash: unset: NAME: cannot unset: readonly variable
[root@CentOS8 ~]# export NAME=hjjj
-bash: NAME: readonly variable
[root@CentOS8 ~]# exit
logout
[root@CentOS8 ~]# echo $NAME

[root@CentOS8 ~]#

说明:

readonly readnolyname=PAT   定义只读变量  
exit                        退出当前shell

bash运算符

  bash特殊字符说明

() : 列表中在子shell中执行,退出后失效
{} : 列表就在当前shellz中执行,退出后仍然后效
栗子:

[root@CentOS8 ~]# NAME=admin; echo $BASHPID; ( echo $NAME; NAME=administrator; echo $NAME; echo $BASHPID; ); echo $NAME 
21776
admin
administrator
21847
admin
[root@CentOS8 ~]# NAME=admin; echo $BASHPID; { echo $NAME; NAME=administrator; echo $NAME; echo $BASHPID; }; echo $NAME  
21776
admin
administrator
21776
administrator

注: { commadn }前后有空格分隔,且{};后面有分号分隔表示一个独立的命令,因为命令为结束,最后一个时,可以不加分号;()同{}

$* 传递给脚本的所有参数,全部参数合成成一个字符串
$@ 传递给脚本的所有参数,每个参数都是独立字符串
栗子:

[root@centos7 shell]# cat farthre.sh 
#!/bin/bash
#
echo all arg are $*  
./son.sh "$*"
[root@centos7 shell]# cat son.sh 
#!/bin/bash
#
#echo "srarting son.sh"
#echo "son.sh pid is $BASHPID"
#echo "name=$name"
#sleep 100
echo "all arg are $1" #取传递过来的第一个参数
执行1
[root@centos7 shell]# bash farthre.sh 1 2 3
all arg are 1 2 3
all arg are 1 2 3
修改farthre.sh$*$@
执行2
[root@centos7 shell]# bash farthre.sh 1 2 3
all arg are 1 2 3
all arg are 1

算数运算符的表示

    1、let是运算,后面跟的参数当作算术计算
    let var=算术表达式

    2、var=$[算术表达式]

    3、var=$((算术表达式))

    4、expr 外部算数命令
    #expr 1 + 2  每个参数的都是独立的,不写到一起,有的字符需要转义,如\*等 

    5、echo '算术表达式' | bc

    6、declare -i n  定义该变量为整数
    n=2+3   |  n=x*y    #x=10 y=30已提前定义
    echo $n
    5       |  300      #把n当做整数,所以他的和也必然是一个整数

i++ 先赋值后加加

[root@centos7 ~]# id=0
[root@centos7 ~]# let x=id++
[root@centos7 ~]# echo $id
1
[root@centos7 ~]# echo $x
0

++i 先加加后赋值

[root@centos7 ~]# id=0
[root@centos7 ~]# let x=++id
[root@centos7 ~]# echo $id
1
[root@centos7 ~]# echo $x
1

eq 比较数字
= 比较字符串
[] 简单的判断 [] and[[]] 都可做短路运算
[[]] 扩展正则判断 不支持 -a并且 -o或者使用 []支持
? 数匹配括号中的值,可有可无
$ 以某值结尾
[] 匹配[]中任意字符

[[ 1 =   [ Y y ] ( [ E e ] [ S s ] ) ? 1 =~ ^[Yy]([Ee][Ss])? 1= [Yy]([Ee][Ss])? ]]

逻辑判断

与:
1 、只有全为1,结果为1,只要有一个为0,结果就是0
2、 和1与,结果为原值,和0与,结果为0


只要有一个1,结果为1;全为0,结果才为0

异或:^
异或的两个值,相同的为假,不同为真

 
异或的应用(数值交换)

[Centos7@localhost ~]# x=10 y=12; x=[xy];y=[xy];x=[x^y];echo x= x ; e c h o y = x; echo y= x;echoy=y
x=12
y=10

运行步骤:
1.x=[x=10^y=12]; x=第三值
2.y=[x=第三值^y=12]; y=x=10
3.x=[x=第三值^y=x=10];x=y=12

短路运算

    短路与
    cmd1 && cmd2: 如果成功,执行cmd2;若果失败,不执行cmd2

    短路或
    cmd1 || cmd2: 如果成功,不执行cmd2;如果失败,执行cmd2

    可合并使用
    cmd1 && cmd2 || cmd3
    前面整体成功,执行后面的
    前面有任意一个失败,执行后面的 

    cmd2 || cmd2 && cmd3
    前面任意为真,不执行cmd2,整体为真执行cmd3
    前面不为真,执行第二个,整体为真执行第三个
    整体为假,不执行cmd3


    test EXPRESSIN和[ EXPRESSION ] 是等价的
    EXPRESSION前后必须有空白字符
    [[ EXPRESSION ]] 常用于扩展正则表达式匹配时使用

综合实例:
匹配IP地址的合法性

[centost7@localhost ~] # ip=a254.254.254.254;[[ KaTeX parse error: Can't use function '\.' in math mode at position 50: …2}|2[0-5][0-4])\̲.̲){3}([0-9]|[1-9… ]] && echo -e “\e[1;32mOK\e[0m” ||echo -e “\e[1;35mNo\e[0m”
No

case函数

case $command in #多用于重复性判读
path)
    command1
    ;;
path)    
    command2
    ;;
*)
    ;;
esac

[] 匹配其中的任意字符
a|b  a或b
*  任意长度字符
?  任意单个字符  

补充:

bash脚本安全相关命令
set -u:避免定义的变量没有使用,显示提示信息,避免误操作
set -e: 一旦脚本有错立即退出,不继续执行后续命令,减少损失

反斜线(/)转义符
shell不支持小数运算,仅支持整数
bash内建随机变量生成函数 $RANDOM

生成随机简单密钥
[centos7@localhost ~]# tr -dc ‘[:alnum:]’ < /dev/urandom |head -c 12
取出该文件的所有数字和字母的补集,再删除后打印最终结果再取前十二个字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值