⼀、什么是变量
简单说就是让⼀个特定的字符串代表不固定的内容
yy=123
yy是变量的名字,123是变量的值
echo $yy //查看变量的值
就是⽤⼀个简单的好记的字符串,来取代⽐较复杂或者容易变动的数据
⼆、变量的设定
设定规则:
变量名与变量内容以⼀个等号 = 的连结,且等号两边不能有空格。如下所示:
myname=XiguaTian
-
变量名称只能是英⽂字⺟与数字,但是开头字符不能是数字,如下为错误:
2myname=xiguatian
变量内容若有空格符可使⽤双引号 " 或单引号 ' 将变量内容组合起来,但双引号内的特殊字符如 $ 、 ! 等,可以保有原本的特性,如下所示:
var="lang is $LANG"
#则
echo $var
#可得
lang is en_US
感叹号 ! 不可以在shell命令⾏⾥直接在双引号⾥使⽤,但是可以在脚本中使
⽤。
单引号内的特殊字符则仅为⼀般字符 (纯⽂本),如下所示:
var='lang is $LANG'
# 则
echo $var
#可得
lang is $LANG
可⽤转意符 \ 将特殊符号(如 [Enter] , $ , \ , 空格符 , 等)变成⼀般字
符;
在⼀串命令中,还需要藉由其他的命令提供的信息,可以使⽤反单引号 `命
令` 或 $(命 令) (推荐这种)。特别注意,那个反引号 是键盘上⽅癿数字
键 1` 左边那个按键,⽽不是单引号!
例如想要取得
核⼼版本的内容:
version=version
#可得
4.9.125-linuxkit
[root@biudefor script]# a=10
[root@biudefor script]# b=$a1 //被认为a1是一个变量
[root@biudefor script]# echo $b
[root@biudefor script]# b=${a}1
[root@biudefor script]# echo $b
101
增加变量的内容时,则可⽤ "{变量}字符串 (推荐)累加内容,如下所示:
PATH="$PATH":/home/bin
PATH=${PATH}:/home/bin
增加一个环境变量的位置,可以在里面自定义给命令赋值
[root@biudefor script]# echo $PATH
/usr/local/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@biudefor script]# mkdir /script/bin
[root@biudefor script]# echo "uname -r" > /script/bin/gg
[root@biudefor script]# chmod +x /script/bin/gg
[root@biudefor script]# gg
-bash: gg: command not found
[root@biudefor script]# PATH=${PATH}:/script/bin
[root@biudefor script]# gg
3.10.0-693.el7.x86_64
若该变量需要在其他⼦程序执⾏,则需要以 export 来使变量变成环境变量:export PATH
通常⼤写字符为系统默认变量,⾃定义变量可以使⽤⼩写字符,⽅便判断
(纯粹个⼈习惯) ;
取消变量的⽅法为使⽤ unset : unset 变量名称 例如取消 myname 的设
定:
unset myname
三、 环境变量
这种变量是会影响bash环境操作的,会在真正进⼊系统前由⼀个bash程序读⼊到系统中。通常都环境变量的名字以⼤写字符命名。
常⻅环境变量
PATH HOME MAIL SHELL PWD USERNAME UID ID 等。
RANDOM 随机数
echo $RANDOM
PS1 :(提示字符的设置)
\d :可显示出“星期 ⽉ ⽇”的⽇期格式,如:"Mon Feb 2"
\H :完整的主机名称。举例来说,⻦哥的练习机为“study.centos.vbird”
\h :仅取主机名称在第⼀个⼩数点之前的名字,如⻦哥主机则为“study”后
⾯省略
\t :显示时间,为 24 ⼩时格式的“HH:MM:SS”
\T :显示时间,为 12 ⼩时格式的“HH:MM:SS”
\A :显示时间,为 24 ⼩时格式的“HH:MM”
\@ :显示时间,为 12 ⼩时格式的“am/pm”样式
\u :⽬前使⽤者的帐号名称,如“dmtsai”;
\v :BASH 的版本信息,如⻦哥的测试主机版本为 4.2.46(1)-release,仅
取“4.2”显示
\w :完整的⼯作⽬录名称,由根⽬录写起的⽬录名称。但主⽂件夹会以 ~
取代;
\W :利⽤ basename 函数取得⼯作⽬录名称,所以仅会列出最后⼀个⽬录
名。
# :下达的第⼏个指令。
$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $
读取环境变量的值
echo $HOME
列出shell环境下的所有环境变量及其内容
env // env 是 environment (环境) 的简写,默认的环境变量
set // 列出系统中所有的变量,包括⾃定义的变量
export 变量名 // 使⾃定义的变量 成为 环境变量,环境变量可以被继承
⼦程序仅会继承⽗程序的环境变量, ⼦程序不会继承⽗程序的⾃订变量
name=shark
export name
bash
echo $name
bash 的环境变量⽂件
longin shell
取得shell时需要完整的登⼊流程;特点是登⼊时需要⽤户帐号和密码
non-login shell
取得shell时不需要再次输⼊帐号和密码的情况下,所得到的 shell
longin shell 会读取以下两个⽂件:
/etc/profile· :这是系统整体设定,最好不要修改
~/.bash_profile 或 ~/.bash_login 或 ~/.profile` :属于个⼈的配置⽂件
/etc/profile 会主动依序调⽤以下脚本⽂件:
/etc/inputrc :定义快捷键
/etc/profile.d/*sh :定义bash操作接⼝颜⾊、语系、命令别名等
/etc/locale.conf :定义系统的默认语系
bash 在读完 /etc/profile 后,接下来会读取以下3个⽂件,且只会读去⼀个,会按照以下顺序优先读取
~/.bash_profile //会调⽤ ~/.bashrc ,
也会有新的环境变量在下⾯的⽂件中被添加
~/.bash_login
~/.profile
最终, ~/.bashrc 才是最后被读⼊到系统环境中的⽂件
让这些环境变量⽂件中的变量等设置及时在当前 shell 终端中⽣效,有下两种⽅式
source ~/.bashrc
或者
~/.bashrc
no-longin shell 当取得 no-longin shell 时,该 shell 仅会读取
~/.bashrc ⽂件 ⽽ ~/.bashrc 最后⼜会调⽤ /etc/bashrc
/etc/bashrc 的作⽤:
依据不同的UID定义出 umask 值
依据不同的UID定义出提示符(就是PS1变量)
呼叫 /etc/profile.d/*.sh 的设定
其他的相关配置⽂件
/etc/man.config
这个⽂件最重要的就是定义了 MANPATH 这个变量,它定义了man page 的路径;
在以tarball的⽅式安装软件时有⽤
~/.bash_history
历史命令记录⽂件;记录的数量与HISTFILESIZE变量有关。在 /etc/profile ⾥ • ~/.bash_logout
记录了当我注销bash后,系统再帮我做完什么动作后才离开的。
四、预定义变量
预定义的特殊变量有着特殊的含义,⽤户不可以更改,所有的预定义变量都由 $ 符号和另外⼀个符号组成,常⽤的预定义特殊变量如下:
$! 上⼀个后台命令对应的进程号
$? 上⼀个命令的退出状态,为⼗进制数字,如果返回为0,则代表执⾏成功,则否
为不成功。
$$ 当前的进程号PID
以上变量请配合 echo 使⽤,例如:
echo $!
echo $$
echo $?
read
[root@www ~]# read [-pt] variable
选项不参数:
-p :后⾯可以接提示字符!
-t :后⾯可以接等待的『秒数!』这个⽐较有趣~不会⼀直等待使⽤者啦!
#vi read.sh
read -p “请输⼊你的姓名” name
echo "你的姓名是: $name"
五、变量内容的删除、取代与替换
删除
先让小写的 path 自订变量设置的与 PATH 内容相同
[dmtsai@study ~]$ path=${PATH}
[dmtsai@study ~]$ echo ${path} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin
删除最后一个
echo ${path%:*}
% 从字符串的后面开是进行匹配删除,但匹配到第一个时就结束匹配。
:* 就是需要进行匹配的字符串 , : 是普通字符串 * 是通配符,代表任何数量的任意字符串。
所以下面的红色字体的字符串将会匹配后进行删除
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin
删除第一个
echo ${path#*:}
是从前面开始匹配删除,匹配到道理和上面的 % 同样的道理
${path#*:} 就是 从变量值的最前面开始匹配,直到遇到第一个 : 结束
所以下面的红色字体会被匹配后删除
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin
取代和替换 11414906-d02066abb6a86a7a.pngvar=${str:-expr}
str 和 var 可以是相同的字符串。比如 inpu_date=${inpu_date:-expr}
expr 可以是任意合法的表达式,比如一个字符串,一个子 shell 的命令 $(date +%F)
示例,假如希望用户输入一个日期,当用户没有输入时,就给一个默认值,这里给的是当天的日期
read -p "输入日期>:" input_date
input_date=${input_date:-$(date +%F)}
echo "当前的日期是:${input_date}"
#(-)当变量没有赋值时,就会获取设定的默认值,如果变量已经被赋值或空值,就不会获取这个默认值
[root@biudefor script]# a=10
[root@biudefor script]# b=${a-10}
[root@biudefor script]# echo $b
10
[root@biudefor script]# unset a
[root@biudefor script]# b=${a-10}
[root@biudefor script]# echo $b
10
#(:-)当变量没有被赋值或空值是,就会获得这个设定的默认值,如果变量被赋值就不会改变
[root@biudefor script]# a=10
[root@biudefor script]# b=${a:-99}
[root@biudefor script]# echo $b
10
[root@biudefor script]# unset a
[root@biudefor script]# b=${a:-99}
[root@biudefor script]# echo $b
99
[root@biudefor script]# unset a
[root@biudefor script]# a=''
[root@biudefor script]# b=${a:-99}
[root@biudefor script]# echo $b
99
位置变量
# $? 上一条命令的返回值
# $0 程序名称,脚本的文件名
# $1 执行脚本时,跟到脚本后面的第一个参数
# $2...
# $# 位置变量的个数
# $@ 所有的位置变量的值
[root@biudefor script]# vim weizhi.sh
echo "$0"
echo "$1"
echo "$2"
echo "$#" //位置参数的个数
echo "$@" //列出所有的参数
[root@biudefor script]# bash weizhi.sh 1 2 3
weizhi.sh
1
2
3
1 2 3
时间运算
// 计算 3 小时之后是几点几分
date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具体日期
date +%F -d "20190910 -1 day"
date +%F -d "20190910 1 day"
// 计算两个日期相差天数, 比如计算生日距离现在还有多少天
d1=$(date +%s -d 20180728) //%s Unix创建至今的秒数
d2=$(date +%s -d 20180726)
echo $(((d1-d2)/86400)) // echo $(( 80 - 75 )) 5
[root@biudefor script]# echo $((149/30));echo $((149%30)) # / 取整 ,% 取余
4
29
## let
[root@biudefor script]# let n=5
[root@biudefor script]# echo $n
5
[root@biudefor script]# let n=5+5
[root@biudefor script]# echo $n
10
[root@biudefor script]# let n=10/5
[root@biudefor script]# echo $n
2
网友评论