Shell中的变量

文章详细介绍了Linuxshell中的变量定义,包括如何定义、取消变量,查看变量值的方法。讨论了环境变量、位置变量和预定义变量的特性及其用途,如PATH对命令搜索的影响。还提到了自定义变量以及不同类型的引号在变量使用中的区别。此外,文章还阐述了`read`命令用于从标准输入获取变量值,以及局部和全局变量的作用范围和如何设置全局变量。
摘要由CSDN通过智能技术生成

1、定义变量

以固定的名称,存放可以有变化的值。

定义变量的格式: 

变量名=变量值

取消变量的格式:

unset  变量名

注意事项:

=(等于号)两边不能有空格,不要使用关键字做变量名,例如 ls、cd 等。

如果变量名已经存在则覆盖之前的变量值。

变量名称有:字母、数字、下划线组成,不能以数字开头。

2、查看变量

查看变量的语法格式:

$变量名  或者  ${变量名}

花括号的使用:可以告诉计算机我们要使用的 变量名 是花括号里面的值。

[root@node2 ~]# x=12
[root@node2 ~]# var1=redhat
[root@node2 ~]# echo $x
12
[root@node2 ~]# echo $var1
redhat
[root@node2 ~]# echo ${var1}
redhat
[root@node2 ~]# echo ${var1}8.0
redhat8.0
[root@node2 ~]# unset x
[root@node2 ~]# echo $x

[root@node2 ~]# 

3、变量的类型

(1)环境变量:变量名通常为大写,有操作系统维护。

存储在/etc/profile 或 ~/.bash_profile 中。

命令env可以列出所有环境变量。

常见的环境变量有:PATH、PWD、USER、UID、HOME、SHELL

[root@node2 ~]# echo $PATH
/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]# 
[root@node2 ~]# echo $UID
0
[root@node2 ~]# echo $USER
root
[root@node2 ~]# 

PATH是命令搜索变量。

我们执行ls等命令后,输入后计算机会在PATH的路径中一级一级查找;如果我们将PATH定义为空,就会发现ls命令找不到了。(这是一个临时的定义,从新打开终端就会失效)

[root@node2 ~]# echo $PATH
/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]# ls
anaconda-ks.cfg  exam                  none      shell_dir  tmp.txt
Desktop          index.html            Pictures  swap       Videos
Documents        initial-setup-ks.cfg  pider     Templates
Downloads        Music                 Public    tmp2.txt
[root@node2 ~]# PATH=
[root@node2 ~]# ls
-bash: ls: No such file or directory
[root@node2 ~]# find /
-bash: find: No such file or directory
[root@node2 ~]# 
[root@node2 ~]# 

(2)位置变量:bash内置变量,存储脚本执行时的参数。

存储脚本执行时的参数。使用$n表示,n为数字序列号。$1、$2、$3、......${10}、${11}、......

[root@node2 ~]# vim vars.sh
#!/bin/bash
  
echo $1
echo $2
echo $3
[root@node2 ~]# 
[root@node2 ~]# bash ./vars.sh 



[root@node2 ~]# bash ./vars.sh 11 22 33
11
22
33
[root@node2 ~]# 

一个小应用:写一个创建用户和密码的脚本:

[root@node2 ~]# vim useradd.sh
#!/bin/bash

useradd $1

echo $2 | passwd --stdin $1

[root@node2 ~]# bash ./useradd.sh tom 123456
Changing password for user tom.
passwd: all authentication tokens updated successfully.
[root@node2 ~]# 
[root@node2 ~]# grep tom /etc/passwd
tom:x:1006:1007::/home/tom:/bin/bash
[root@node2 ~]# 

(3)预定义变量:bash内置变量,可以调用但是不能赋值或修改。

用来保存脚本程序的执行信息。

可以直接使用这些变量,不能为这些变量赋值。

变量名含义
$0当前所在的进程或者脚本名
$$当前运行进程的PID号
$?命令执行后的返回状态,0表示正常,1或其他表示异常
$#已加载的位置变量的个数
$*

所有位置变量的值

[root@node2 ~]# ls /home
harry  hehe  materials  natasha  redhat  roo  sarah  tom
[root@node2 ~]# echo $?
0


[root@node2 ~]# vim pre.sh
#!/bin/bash
echo $0
echo $*
echo $#
echo $$

[root@node2 ~]# bash ./pre.sh aa bb cc dd
./pre.sh
aa bb cc dd
4
3733
[root@node2 ~]# 

(4)自定义变量:用户自主设置的变量。

4、多种引号的区别

双引号" " :允许扩展,以$引用其它变量。

单引号' ':禁止扩展,即便$也视为普通字符。

反引号` `:将命令的执行输出作为变量值,$() 与反引号等效。

[root@node2 test]# touch a b c
[root@node2 test]# touch "a b c"
[root@node2 test]# ls
 a  'a b c'   b   c

5、read标准输入取值

read从键盘读入变量值完成赋值。

格式: read  [ -p "提示信息" ]  变量名

-p 可选,-t 可以指定超时秒数,-s 设置是否在终端显示输入的内容。

[root@node2 ~]# vim read.sh
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" -s pass
echo  
useradd "$name"
echo "$name" | passwd --stdin "$name"


[root@node2 ~]# bash ./read.sh 
请输入用户名:xixi
请输入密码:
Changing password for user xixi.
passwd: all authentication tokens updated successfully.
[root@node2 ~]# 

6、变量的作用范围

局部变量:

新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用。

全局变量:

全局变量在当前Shell以及子Shell环境中均有效。

export  变量名=变量值      :定义全局变量。

[root@node2 ~]# x=11           #定义局部变量。
[root@node2 ~]# sh             #进入子shell。
sh-4.4# echo $x                #没有这个变量,输出为空。

sh-4.4# exit                   #退出子shell。
exit
[root@node2 ~]# export x=11    #定义全局变量。
[root@node2 ~]# sh
sh-4.4# echo $x
11
sh-4.4# 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值