文章目录
数字常量
常见的表示形式
#十进制,默认的,结果是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
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论