bash编程基础

编程入门 行业动态 更新时间:2024-10-27 04:24:59

bash编程<a href=https://www.elefans.com/category/jswz/34/1770030.html style=基础"/>

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 '算术表达式' | bc6、declare -i n  定义该变量为整数n=2+3   |  n=x*y    #x=10 y=30已提前定义echo $n5       |  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前面不为真,执行第二个,整体为真执行第三个整体为假,不执行cmd3test 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
取出该文件的所有数字和字母的补集,再删除后打印最终结果再取前十二个字符

更多推荐

bash编程基础

本文发布于:2024-02-12 14:07:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688108.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基础   bash

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!