shell编程之二(数字常量,内置变量,声明变量类型,变量赋值,变量引用,shell嵌套变量引用)

数字常量

常见的表示形式
    #十进制,默认的,结果是32
    let "a = 32"
    echo $a

    #八进制,以0开头,结果是26
    let "a = 032"
    echo $a

    #十六进制,以0x开头(或者0X),结果是50
    let "a = 0x32"
    echo $a

shell中常见变量(内置变量)

位置参数和其他特殊情况(shell变量中特殊的变量)
    $0 $1 $2 $3 ${10} ${12} $*

    $1      # 表示第一个参数,$2,表示第二个参数
    $0      # 表示脚本的名字
    ${12}   # 表示第12个参数,只是从10开始,都有使用{}括起来

    $#      # 表示传递到脚本的参数数量
    $$      # 脚本运行的进程号
    $?      # 表示上一个shell指令的退出状态,对于shell脚来说,表示脚本内最后一个指令的返回状态
    $*和$@一样     表示从$1开始的所有参数

    $!          # 运行在后台的最后一个作业的PID(进程ID)
    $_          # 保存之前执行的命令的最后一个参数的值

如何获取变量值的字符串长度
    net="baidu.com"
    ${#net}         # 获取变量$net的字符长度,结果是9

其他特殊用法
    ${!ne*}         # 匹配之前最近一次已经声明过的,且以net开头的变量(注意只是匹配变量名字,并不匹配变量的内容),类似 shell 的 history命令中的 !77

其他内置变量
    $HOME       # 家目录
    $PATH       # 是非常重要的环境变量(存放可执行文件的路径)
    $USER       # 当前用户名
    $UID        # 当前用户UID
    $GROUPS     # 当前用户所属的组id
    $EUID       # "有效"用户ID,不一定是UID,比如su场景
    $HOSTNAME   # 系统名,相当于命令hostname
    $HOSTTYPE   # 主机类型,x86_64
    $OSTYPE     # 操作系统类型
    $PATH       # 可执行文件的搜索路径
    $RANDOM     # 返回一个0~32767之间的随机整数

    $BASH         # Bash二进制程序文件的路径
    $BASH_VERSION # Bash版本号
    $SHELL      # 记录了当前系统默认的shell
    $PPID       # 记录了创建当前进程的进程号,即当前进程的父进程号
    $OLDPWD     # 之前所在目录
    $PWD        # 当前所在目录
    $IFS        # 内部域分隔符,bash默认为空白(空格, 制表符,和换行符),可以修改
    $LINENO     # 记录自身在shell脚本中所在的行号,注意该变量只在shell脚本中有意义

    $HISTCMD    # 记录当前有多少条历史命令
    $HISTFILE   # 历史命令文件保存路径,结果是/root/.bash_history
    ^STRING^string^ # 使用string替换STRING

声明变量类型(declare|typeset两个命令完全一样)

    declare -r net1             # 只读变量,指定变量net1为只读变量,任何试图修改或者重新赋值都会报错
    declare -r net1=baidu.com   # declare允许在声明变量类型的同时给变量赋值
    declare -i net2             # 整型,指定变量net2为整数型
    declare -a net3             # 数组,
    declare -f net4             # 函数(如果在脚本中使用declare -f, 而不加任何参数的话, 那么将会列出这个脚本之前定义的所有函数.)
    declare -x export           # 声明一个变量, 并作为这个脚本的环境变量被导出

shell中变量的赋值

变量赋值 注意点:
    1:等号=两边可以有空格,这不影响赋值
    2:如果值value包含空格,需要用""引起来
    3:变量名variable不能以数字开头,并且职能包含大小写,下划线,和数字

1、简单赋值
    a=23
    echo $a

2、for循环伪赋值
    for a in {7,8,9,11}
     do
       echo -en "$a\n"
     done

3、命令结果赋值(两种)
    a=`pwd`; echo $a
    a=$(pwd); echo $a

变量替换、变量截取、变量长度获取

变量默认赋值操作
    net="baidu.com"
    ${net:='default value'}    # 表示变量为空或未定义时,把默认值赋值给该变量
    ${net:-'default value'}    # 表示变量为空或未定义时,返回默认值,但并不把默认值赋值给该变量
    ${net:+'default value'}    # 表示变量不为空时,返回默认值,并且也不重新赋值

变量字符的替换与删除(不改变变量原值)
    net="www.baidu-baidu.com" #变量简单赋值
    ${net/baidu}        # 删除,从左开始最短匹配第一个baidu字符串并删除,结果是www.-baidu.com
    ${net//baidu}       # 删除(贪婪模式),从左开始匹配所有的baidu字符串,并删除,结果是www.-.com
    ${net/baidu/qq}     # 替换,从左开始最短匹配第一个baidu并替换为qq,结果是www.qq-baidu.com
    ${net//baidu/qq}    # 替换(贪婪模式),从左开始匹配所有的baidu字符串,并替换为qq,结果是www.qq-qq.com
    ${net/#www}         # 删除,匹配以www开头的字符串,并删除,结果是.baidu-baidu.com
    ${net/#www/wiki}    # 替换,匹配以www开头的字符串,并替换为wiki,结果是wiki.baidu-baidu.com

    ${net#*.}           # 删除,从左开始,最短匹配任意字符到第一个.为止(含.的)所有内容,并删除,结果是baidu-baidu.com (常见用法)
    ${net##*.}          # 删除,从左开始,最长匹配任意字符到最后一个.为止(含.的)所有内容,并删除,结果是com (常见用法)
    ${net%.*}           # 删除,从右开始,最短匹配任意字符到第一个.为止(含.的)所有内容,并删除,结果是www.baidu-baidu (常见用法)
    ${net%%.*}          # 删除,从右开始,最长匹配任意字符到最后一个.为止(含.的)所有内容,并删除,结果是www (常见用法)

    ${net%baidu}        # 删除,从右开始最短匹配第一个baidu,并删除,实测没效果
    ${net%%baidu}       # 删除(贪婪模式),实测没效果
    ${net%baidu/qq}     # 替换,实测没效果
    ${net%%baidu/qq}    # 替换(贪婪模式),实测没效果
    ${net/%com}         # 删除,将匹配到以com结尾的字符串删除,结果为www.baidu-baidu.
    ${net/%com/cn}      # 替换,将匹配到以com结尾的字符串替换为cn,结果是www.baidu-baidu.cn

变量的截取(注意变量位置第一个是0,不是1)(不改变变量原值)
    net="baidu.com"
    ${net:3:2}      # 从3号字符开始截取2个字符,结果是du
    ${net:3}        # 从3号字符开始,默认截取到最后,结果是du.com
    ${net: -3}      # 从倒数第3个字符截取到末尾,结果是com,(注意中间有空格)
    ${net:1-3}      # 从倒数第-2(2)个字符截取到末尾,结果是om

变量

利用unset清除变量的值
    unset 变量名

用readonly将变量设为只读模式
    tianyu=123
    readonly tianyu

查看系统中所有的只读变量
    readonly

如何定义一个环境变量
    先定义一个变量,然后用export声明一下(这个定义的变量名,建议大写)
    APPAT=/usr/sbin
    export APPAT

查看系统中所有的环境变量
    env

如何清除环境变量(与清除其他变量相同)
    unset APPAT

如要在PATH中添加新目录
    export PATH="new directory":$PATH

PS1和PS2,称为提示符变量,用于设置提示符格式
wsfnk@ThinkPad-E540:~$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
wsfnk@ThinkPad-E540:~$ echo $PS2
>

    其中提示符变量中特殊符号及其意义
    \d  以"周 月 日"格式显示日期
    \H  主机名和域名
    \h  主机名
    \s  shell的类型名称
    \T  以12小时制显示时间,HH:MM:SS
    \t  以24小时制显示时间,HH:MM:SS
    \@  以12小时制显示时间,am/pm
    \u  当前的用户名
    \v  bash shell的版本号
    \V  bash shell的版本号和补丁号
    \w  当前工作目录的完整路径
    \W  当前工作目录的名字
    \#  当前命令的序列号
    \$  如果UID为0,则打印#,否在打印$

PS2是用于设置二级shell提示符的环境变量(当命令没有输入完整时显示,默认是>)

环境变量的配置文件(linux的环境变量较多,管理员可以通过环境变量配置文件来进行管理)
    下面三个文件都存在与用户的家目录下,是以.开头的隐藏文件
    .bash_profile(最重要,有的linux版本名字是.profile)
    .bashrc
    .bash_logout

当修改环境变量的配置文件后,需要注销后再次登录才能生效,当然可以使用下面的命令刷新,立即生效
    source .bash_profile
    或则
    . .bash_profile

变量的引用

变量的引用

    ""  部分引用,引用除$,`,\三种符号之外的所有字符
    ''  全引用,引用所有的字符
    ``  shell将反引号中的内容解释为命令
    \   转移符,屏蔽下一个字符的特殊意义

    echo "$PWD is ok"   #使用""这里的$PWD将被替换
    echo '$PWD is ok'   #使用''这里的$PWD不会被替换

两种不同的变量引用方式
    hello="A B  C   D"
    echo $hello     #结果是 A B C D
    echo "$hello"   #结果是 A B  C   D
    # 就象你看到的echo $hello   和    echo "$hello"   将给出不同的结果.

Shell双重变量引用

#!/bin/bash
    #从标准输入给变量A传递一个参数
    read -p "请输A端节点:" A
    #定义一个变量Node,为其赋值为192.168.1.1
    Node=192.168.1.1

    Z=${A}_PPL
    现在需要在一行调用变量Z

    eval echo "ip addr add "$"$A"_Dn42_ip/32" peer ${ZIPDN42}/32 dev ${Z}_$ZASN
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/506.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/5/20作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录