bash变量

news/2024/7/5 10:55:19 标签: shell, java, 大数据

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.用户自定义变量

在bash中,变量默认都是字符串型,若要进行数值运算,则需要指定变量类型为数值类型

给变量赋值时等号两边不能有空格,如果变量本身有空格,则需要用单引号或者双引号括起来

用户自定义变量只是在当前shell中生效

变量可叠加

1.1变量定义

###自定义变量name
[root@wenhaijin tmp]# name='wen haijin'
[root@wenhaijin tmp]# echo $name
wen haijin
###变量的叠加
[root@wenhaijin tmp]# aa=123
[root@wenhaijin tmp]# aa="$aa"456
[root@wenhaijin tmp]# echo $aa
123456
[root@wenhaijin tmp]# aa=${aa}789
[root@wenhaijin tmp]# echo $aa
123456789

1.2变量查看

使用set命令可以查看系统所有的变量

###使用set查看系统所有变量
[root@wenhaijin tmp]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
CLASSPATH=/usr/java/jdk1.8.0_111/jre/lib/ext:/usr/java/jdk1.8.0_111/lib/tools.jar
COLORS=/etc/DIR_COLORS
COLUMNS=80
CVS_RSH=ssh
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=wenhaijin
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
JAVA_HOME=/usr/java/jdk1.8.0_111
LANG=en_US.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=22756
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/tmp
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QTLIB=/usr/lib64/qt-3.3/lib
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='113.87.160.186 56253 22'
SSH_CONNECTION='113.87.160.186 56253 172.18.69.197 22'
SSH_TTY=/dev/pts/2
TERM=vt100
UID=0
USER=root
_=123456789
aa=123456789
colors=/etc/DIR_COLORS
name='wen haijin'

1.3变量的删除

使用“unset 变量名”可以删除变量

###删除变量aa
[root@wenhaijin tmp]# unset aa

2.环境变量

这种变量中主要保存的是和系统操作环境相关的数据

用户自定义变量只是在当前shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效

如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效

2.1定义环境变量export

###申明一个本地变量name
[root@wenhaijin tmp]# name=wenhaijin
###申明一个环境变量age
[root@wenhaijin tmp]# export age=18
###申明一个本地变量sex
[root@wenhaijin tmp]# sex=nan
###将本地变量变为环境变量
[root@wenhaijin tmp]# export sex

###查看变量
[root@wenhaijin tmp]# set
###前面省略了很多信息,只展示我们所关注的
age=18
colors=/etc/DIR_COLORS
name=wenhaijin
sex=nan

###在此处进入一个子shell(可以用pstree查看bash的线程树)
[root@wenhaijin tmp]# bash
###再查看变量发现环境变量age和sex依然生效,而name变量在这里已经访问不到
[root@wenhaijin tmp]# set
……………
age=18
colors=/etc/DIR_COLORS
sex=nan

###退出当前bash,回到上一级bash
[root@wenhaijin tmp]# exit
exit

2.2查询环境变量env

可以使用set命令查询所有变量,使用命令env则查询环境变量

###使用env查询环境变量省略号表示中间省略了一些暂时不太关注的环境变量信息
[root@wenhaijin tmp]# env
…………
age=18
…………
sex=nan
G_BROKEN_FILENAMES=1
_=/bin/env

2.3调用变量$

调用环境变量与调用自定义变量(本地变量)是一样的

[root@wenhaijin tmp]# echo $age
18

2.4删除环境变量unset

删除环境变量 也是和删除自定义变量(本地变量)是一样的

[root@wenhaijin tmp]# unset sex

2.5两个比较重要的环境变量

2.5.1 PATH环境变量

这个学编程的都清楚,系统之所以能执行各种命令,就是因为这些命令保存在PATH所标注的各个路径中

使用env或者直接使用echo $PATH可以看到这个环境变量

###查看PATH环境变量
[root@wenhaijin tmp]# env | grep PATH 
PATH=/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
CLASSPATH=/usr/java/jdk1.8.0_111/jre/lib/ext:/usr/java/jdk1.8.0_111/lib/tools.jar

###也可以直接使用$符号调用输出
[root@wenhaijin tmp]# echo $PATH
/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

2.5.2 定义系统提示符的变量PS1

131938_N3mD_2988360.png

其实系统并没有把PS1归为环境变量,所以需要使用set或者echo $PS1来进行输出查看

###其实系统并没有把PS1归为环境变量,所以使用env查看不到该变量
[root@wenhaijin tmp]# env | grep PS1
[root@wenhaijin tmp]# set | grep PS1
PS1='[\u@\h \W]\$ '
[root@wenhaijin tmp]# 

###使用echo $PS1来进行输出查看
[root@wenhaijin tmp]# echo $PS1
[\u@\h \W]\$
[root@wenhaijin tmp]# 

从上面的结果可以看出

\u为当前用户名即root

@是一个标识符号没有特殊意义,依然对应@

\h为简写主机名,对应wenhaijin

\W为当前所在目录的最后一个目录,对应tmp目录

\$表示命令提示符,当前是root用户,所以对应#;如果是普通用户,则对应$符号

PS1变量是可以更改的

###在系统提示符中将当前时间展现出来,同时将当前目录的最后一个目录改成整个目录的完整路径
[root@wenhaijin13:38:07 /tmp]# PS1='[\u@\h \t \w]\$ '
###立竿见影,效果如下(这种修改方式是临时的,系统一旦重启将会失效,若要永久生效则需写入到对应的配置文件中)
[root@wenhaijin 13:38:52 /tmp]# 

3.位置参数变量

这种变量主要用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

144037_UGnQ_2988360.png

3.1 $n的用法

$0表示命令本身,$0-$9分别表示第一到第九个参数,第10个以上的参数用${n}表示,如${10}表示第10个参数$

[root@wenhaijin tmp]# vim param1.sh 

#!/bin/bash
#该脚本的功能是计算用户输入的两个数的和
num1=$1
num2=$2
#在shell脚本中进行运算操作的写法是将要运算的表达式用$(( ))包起来,这是固定写法
echo "the sum of the two numbers input is: $(( $num1+$num2 ))"
~
~
~
"param1.sh" 5L, 92C written  

#修改一下该shell的权限,赋予可执行权限
[root@wenhaijin tmp]# chmod 755 param1.sh 
                                
[root@wenhaijin tmp]# ./param1.sh 
./param1.sh: line 5: + : syntax error: operand expected (error token is "+ ")

[root@wenhaijin tmp]# ./param1.sh 10 20
the sum of the two numbers input is: 30
[root@wenhaijin tmp]# 

3.2 $*和$@的区别

都代表所有参数,区别在于$*把所有参数看成一个整体,$@把所有参数中的各个参数区分对待

[root@wenhaijin tmp]# vim param2.sh
###shell脚本的内容如下:
#!/bin/bash

echo 'the result of $*:'
for i in "$*"
        do
                echo "the param index of i is: $i"
        done


echo 'the result of $@:'
for y in "$@"
         do
                echo "the param index of i is: $y"
        done

~
~
~
"param2.sh" 17L, 212C written 

给shell脚本赋予执行权限并演示执行结果
[root@wenhaijin tmp]# chmod 755 param2.sh 

###执行该shell,$*与$@的区别一目了然
[root@wenhaijin tmp]# ./param2.sh 10 23 40 50 62
the result of $*:
the param index of i is: 10 23 40 50 62
the result of $@:
the param index of i is: 10
the param index of i is: 23
the param index of i is: 40
the param index of i is: 50
the param index of i is: 62

3.3$#代表参数个数,不包含当前命令本身(即$0)

直接编辑上面的shell(param2.sh),末尾加入下面两句

echo 'the result of $#:'
echo "$#"

执行该shell,结果如下:

[root@wenhaijin tmp]# ./param2.sh 11 22 33 44 55
the result of $*:
the param index of i is: 11 22 33 44 55
the result of $@:
the param index of i is: 11
the param index of i is: 22
the param index of i is: 33
the param index of i is: 44
the param index of i is: 55
the result of $#:
5

4.预定义变量

是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

位置参数变量其实也可以看成是预定义变量中的一种

225006_DMM2_2988360.png

4.1 $?的使用

$?用来判断上一条命令是否正确执行,上一条命令是否正确执行我们一看执行结果就知道了,所以该命令很少在命令行中使用,主要是应用在程序中

[root@wenhaijin tmp]# ls
012   abc   fabc       param2.sh
0abc  abcd  param1.sh
###返回0代表上一条命令正确执行,返回其他数字代表上一条命令执行异常
[root@wenhaijin tmp]# echo $?
0

###$?为127表示命令不存在
[root@wenhaijin tmp]# lsaaa
-bash: lsaaa: command not found
[root@wenhaijin tmp]# echo $?
127

###$?为1表示文件或目录不存在
[root@wenhaijin tmp]# cat aaaa
cat: aaaa: No such file or directory
[root@wenhaijin tmp]# echo $?
1
[root@wenhaijin tmp]#

4.2 $$表示当前进程的进程号(PID)

###当前进程号为13508
[root@wenhaijin tmp]# echo $$
13508

4.3 $!表示后台运行的最后一个进程的进程号(PID)

###当前后台运行的最后一个进程号为18906
[root@wenhaijin ~]# echo $!
18906

4.4 read接收键盘输入i(比$n更常用)

000618_jAZk_2988360.png

创建shell文件

[root@wenhaijin tmp]# vim read.sh
#!/bin/bash
###接收键盘输入并赋值给变量name,超时时间为30秒,注意变量name前面有个空格
read -t 30 -p "please input your name: " name
echo $name

###接收键盘输入并赋值给变量age,将用户所输入的字符当做隐藏字符,超时时间为30秒
read -s -t 30 -p "please enter your age: " age
echo -e "\n"
echo "Age is $age "
 
###接收键盘输入并赋值给变量sex,"-n 1"表示当用户输入一个字符时触发变量的赋值操作,超时时间为30秒
read -n 1 -t 30 -p "[M/F]: " sex
echo "\n"
echo $sex

修改shell权限

[root@wenhaijin tmp]# chmod 755 read.sh 

执行该shell

[root@wenhaijin tmp]# ./read.sh 
please input your name: wenhaijin
wenhaijin
please enter your age: 

Age is 18 
[M/F]: M\n
M
[root@wenhaijin tmp]# 

 

转载于:https://my.oschina.net/u/2988360/blog/875446


http://www.niftyadmin.cn/n/975995.html

相关文章

FlaskWeb开发:基于Python的Web应用开发实战pdf

下载地址:网盘下载 本书不仅适合初级Web开发人员学习阅读,更是Python程序员用来学习高级Web开发技术的优秀参考书。 • 学习Flask应用的基本结构,编写示例应用; • 使用必备的组件,包括模板、数据库、Web表单和电子邮件…

anaconda下载及vscde

一.anaconda的下载(最简单的方法) https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.07-Windows-x86_64.exe直接点击,直接下载。 选择添加path变量(新手最好点,自己配太麻烦了) 安装…

MariaDB/Mysql 批量插入 批量更新

2019独角兽企业重金招聘Python工程师标准>>> 1. 批量插入 insert into ............ insert into table_name (id, name, age) values (1,乔峰,21),(2,段誉,22),(3,虚竹,23); 2. 批量更新(存在就更新, 不存在就插入) insert into ............ on duplicate key upd…

手把手教你把一篇pdf英文文献瞬间翻译成doc格式的中文

2019独角兽企业重金招聘Python工程师标准>>> https://wenku.baidu.com/view/837d09bbb8f67c1cfad6b8ec.html 转载于:https://my.oschina.net/soho00147/blog/875509

Windows远程桌面连接 出现身份错误 要求的函数不受支持

Windows远程桌面连接 出现身份错误 要求的函数不受支持 https://www.cnblogs.com/Amaya/p/9018653.html 原因 CVE-2018-0886 的 CredSSP 更新 将默认设置从“易受攻击”更改为“缓解”的更新。 摘要 凭据安全支持提供程序协议 (CredSSP) 是处理其他应用程序的身份验证请求的身份…

【hbuilder】如何根据Geolocation获得的坐标获取所在城市?

第一步通过mui.plusReady【表示页面加载事件】调用hbuilder提供的百度定位mui.plusReady(function(){plus.geolocation.getCurrentPosition( geoInf, function ( e ) {},{geocode:true,provider:amap});});第二步通过geolnf 方法来获取具体的定位信息function geoInf( position…

如何理解阻塞和非阻塞同步和异步

1.同步与异步同步和异步关注的是消息通信机制,所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异…

机票分享第一篇 机票由何而来

遥想05年刚加入飞猪,有同学问我机票搜索是怎么做的,一时间不知如何回答。转眼三年过去,为了给自己一个交代,抽时间把所负责的业务、系统、心得加以总结,才有了这几篇机票分享的文章。由于所用的技术、架构都是基于业务…