bash变量类型
变量:内存单元的编号,一段内存空间。
变量类型的作用:事先确定数据存储格式和长度,整型和字符型,存储格式和长度都不一样。
强类型:变量使用前必须声明,初始化 如C语言。
弱类型:变量用时不用声明,不区分类型,bash默认为字符串。
环境变量(全局变量):
在Linux中,内置了一些环境变量如:HOME,PATH,SHELL,UID,GID,HOSTNAME等,可以通过命令env显示所有的环境变量。
定义环境变量:
用户也可以根据自己的需要定义自己的环境变量(全局变量),定义环境变量的方法:
export variable_name=value
#or
variable_name=value
export variable_name
对环境变量进行操作:
可以使用echo对环境变量进行显示
[root@localhost ~]# export variable_name=value
[root@localhost ~]# echo $variable_name
value
利用env,显示所有的环境变量
[root@localhost ~]# env
XDG_SESSION_ID=3052
HOSTNAME=localhost
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
等等............
清除环境变量unset
[root@localhost ~]# unset variable_name
[root@localhost ~]# echo $variable_name
[root@localhost ~]#
只读变量 readonly
[root@localhost ~]# bash
[root@localhost ~]#
[root@localhost ~]# users=100
[root@localhost ~]# readonly users
[root@localhost ~]# user=1
[root@localhost ~]# echo $users
100
查看当前shell中的环境变量:
printenv
env
export
作用域为当前shell进程及其子进程
[root@localhost ~]# echo $HOSTNAME
localhost
[root@localhost ~]# pstree
systemd─┬─abrt-watch-log
├─abrtd
├─acpid
├─2*[agetty]
├─aodh-evaluator:───aodh-evaluator:───12*[{aodh-evaluator:}]
├─aodh-notifier: ───aodh-notifier: ───2*[{aodh-notifier: }]
├─atd
├─auditd───{auditd}
├─beam─┬─erl_child_setup───inet_gethost───inet_gethost
│ └─64*[{beam}]
├─ceilometer-poll───ceilometer-poll───4*[{ceilometer-poll}]
├─cinder-api───cinder-api
├─cinder-backup───cinder-backup
├─cinder-schedule
├─cinder-volume───cinder-volume───sudo
├─crond
├─dbus-daemon
├─dmeventd───2*[{dmeventd}]
├─epmd
├─gnocchi-metricd───4*[gnocchi-metricd───2*[{gnocchi-metricd}]]
├─gnocchi-statsd───{gnocchi-statsd}
├─lsmd
├─lvmetad───{lvmetad}
├─master─┬─pickup
│ └─qmgr
├─memcached───6*[{memcached}]
├─2*[monitor───ovsdb-server]
├─monitor───ovn-northd
├─mysqld───37*[{mysqld}]
├─ntpd
├─ovs-vswitchd
├─ovsdb-server
├─polkitd───6*[{polkitd}]
├─redis-server───2*[{redis-server}]
├─rngd
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─smartd
├─sshd─┬─sshd───bash───pstree
│ ├─sshd───sftp-server
│ ├─sshd───sshd
│ └─2*[sshd]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─xinetd
脚本在执行时,会启动一个子shell进程,命令行启动的脚本会继承当前shell环境变量,而系统自动执行脚本(非命令行启动)就需要自我定义需要的环境变量。
本地变量(局部变量)
bash是一个程序,使用bash与系统交互,此时bash是一个进程
变量的引用: ${varname},大括号可以省略,变量不会继承给子shell,作用域是当前整个bash进程
[root@localhost ~]# users=100
[root@localhost ~]# echo ${users}
100
[root@localhost ~]# echo $users
100
[root@localhost ~]# bash
[root@localhost ~]#
[root@localhost ~]# echo $users
使用单引号,强引用,变量不可替换
使用双引号,弱引用,变量可替换
[root@localhost ~]# users=100
[root@localhost ~]# echo $users
100
[root@localhost ~]# echo "This system useris $users"
This system useris 100
[root@localhost ~]# echo 'This system useris $users'
This system useris $users
位置变量
运行Shell脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 $n 的形式来接收。例如: $1 表示第一个参数, $2 表示第二个参数,依次类推。
如果参数个数达到或者超过了10个,那么就得用 ${n} 的形式来接收了,例如: ${10} 、 ${23} 。 {} 的作用是为了帮助解释器识别参数的边界,这跟使用变量时加 {} 是一样的效果。
$1,$2,$3……$n
特殊变量
$0:当前脚本的文件名。
$#:传递给脚本或函数的参数个数。
$*:传递给脚本或函数的所有参数。当被双引号""包含时,会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
$@:传递给脚本或函数的所有参数。当被双引号""包含时,仍然将每个参数都看作一份数据,彼此之间是独立的。。
$?:上个命令的退出状态,或函数的返回值。
$$:当前Shell的进程ID。对于Shell脚本,就是这些脚本所在的进程ID。
$?:上一个命令执行状态的返回值
bash程序执行有两类返回值
1、程序执行结果。
2、程序执行后状态返回值(0-255),返回值0为正确执行,否则错误执行。
[root@localhost ~]# useradd user1
useradd: user 'user1' already exists
[root@localhost ~]# echo $?
9
[root@localhost ~]# useradd user10
[root@localhost ~]# echo $?
0