shell变量

目录

  • 一.什么是变量
    • 1.变量的命名规则
    • 2.变量的分类

一.什么是变量

在一个脚本周期内,其值可以发生改变的量就是变量。

1.变量的命名规则

在定义变量是,需要遵循一些规则

  1. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  2. 等号左右两侧不能有空格,可以使用下划线_,变量的值如果有空格,需要使用单引号或双引号。比如:“test=“hello world!””。
  3. 不能使用标点符号,不能使用bash里面的关键字
  4. 环境变量建议大写,便于区分
  5. 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含变量名
[root@tdm1 ~]# test=123
[root@tdm1 ~]# test="$test"456
[root@tdm1 ~]# echo $test
123456     
#叠加变量,变量值变成了123456
[root@tdm1 ~]# test=${test}789
[root@tdm1 ~]# echo $test
123456789      
#在叠加变量,变量变成了123456789

关于与单双引号的问题
双引号能够识别变量,双引号能够实现转义(类似"")
单引号是不能识别便变量,只会原样输出,单引号是不能转义的

shell中特殊符号

符号 作用
‘’ 单引号。在单引号中所有的特殊符号,如“$”和”(反引号)都没有特殊含义。单引号括起来的都是普通字符,会原样输出
“” 双引号。。在双引号中特殊符号都没有特殊含义,但是“$”,“`”(esc键下面)和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和( ) 作 用 一 样 , 不 过 推 荐 使 用 ()作用一样,因为反引号非常容易看错。
$() 和反引号作用一样,用来引用系统命令。(推荐使用)
() 用于一串命令执行时,()中的命令会在子Shell中运行
{} 用于一串命令执行时,{ }中的命令会在当前Shell中执行。也可以用于变量变形与替换。
[] 用于变量的测试
# 在Shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\| 转义符,跟在\之后的符号将失去特殊含义,变为普通字符。如将$输出 "$"符号,而不当作是变量引用

单引号和双引号

#定义变量name的值是tian
[root@tdm1 ~]# name=tian
#如果输出使用的是单引号,则$name原封不动的输出
[root@tdm1 ~]# echo '$name'
$name
#如果输出使用双引号,则输出变量的值是 tian
[root@tdm1 ~]# echo "$name"
tian

#反引号括起来的命令正常执行
[root@tdm1 ~]# echo `date`
Mon Sep 11 14:26:25 CST 2023
#但是如果反引号命令被单引号括起来,那么这个命令不会执行,―date`会被当成普通字符输出
[root@tdm1 ~]# echo '`date`'
`date`
#如果是双引号括起来,那么这个命令又会正常执行
[root@tdm1 ~]# echo "`date`"
Mon Sep 11 14:26:40 CST 2023

反引号

#如果命令不用反引号包含,命令不会执行,而是直接输出
[root@tdm1 ~]# echo ls
ls
#只有用反引号包括命令,这个命令才会执行
[root@tdm1 ~]# echo `ls`
47.93.98.117 composetest paramenter2.sh readonly.sh test.sh
#使用$(date)也是可以的
[root@tdm1 ~]# echo $(date)
Mon Sep 11 14:30:28 CST 2023

2.变量的分类

  1. 用户自定义变量: 这种变量是最常见的变量,由用户自由定义变量名和变量的值。

  2. 环境变量: 这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。不是太好理解吧,那么大家还记得在Windows中,同一台电脑可以有多个用户登录,而且每个用户都可以定义自己的桌面样式和分辨率,这些其实就是Windows的操作环境,可以当做是Windows的环境变量来理解。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。

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

  4. 预定义变量: 是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

变量分类 名称 作用 内容
用户自定义变量 自定义 自定义 自定义
用户自定义环境变量 自定义 自定义 自定义
系统自带环境变量 确定 确定 自定义
位置参数变量 确定 自定义 自定义
预定义变量 确定 自定义 自定义

2.1用户自定义变量
2.1.1变量定义

#变量名不能用数字开头
[root@localhost ~]# 2name="tian"
bash: 2name=tian: command not found...
#等号左右两侧不能有空格
[root@tdm1 ~]# name = "tian"
bash: name: command not found...
#变量的值如果有空格,必须用引号包含
[root@tdm1 ~]# name=da tian
bash: tian: command not found...

2.1.2变量调用

#定义变量name
[root@tdm1 ~]# name="da tian"
[root@tdm1 ~]# echo $name    #调用变量 $变量名
da tian

2.1.3变量查看

[root@tdm1 ~]$ set [选项]
选项:
-u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)
-x:如果设定此选项,在命令执行之前,会把命令先输出一次
+<参数> :取消某个set曾启动的参数。

[root@tdm1~]$ set
BASH=/bin/bash
…省略部分输出…
name='shen chao'
#直接使用set 命令,会查询系统中所有的变量,包含用户自定义变量和环境变量
[root@tdm1 ~]$ set -u
[root@tdm1 ~]$ echo $file
-bash: file: unbound variable
#当设置了-u选项后,如果调用没有设定的变量会有报错。默认是没有任何输出的。
[root@tmd1 ~]$ set -x
[root@tdm1 ~]$ ls
+ls --color=auto
anaconda-ks.cfginstall.loginstall.log.syslog sh tdir testtestfile
#如果设定了-x选项,会在每个命令执行之前,先把命令输出一次

[root@tdm1 ~]$ set +x
#取消启动的x参数

2.1.4变量删除

[root@tdm1 ~]$ unset 变量名

2.2环境变量
2.2.1环境变量设置

[root@tdm1 ~]$  export age="18"
#使用export声明的变量即是环境变量

2.2.2 环境变量查询和删除
env命令和set命令的区别:
set命令可以查看所有变量,而env命令只能查看环境变量

[root@tdm1 ~]$ unset gender   #删除环境变量gender
[root@tdm1 ~]$ env | grep gender

2.2.3系统默认环境变量

[root@tdm1 ~]$ env
HOSTNAME=localhost.localdomain      #主机名
SHELL=/bin/bash                     #当前的shell
TERM=linux                          #终端环境
HISTSIZE=1000                       #历史命令条数
SSH_CLIENT=192.168.4.1594824 22     #当前操作环境是用ssh连接的,这里记录客户端ip
SSH_TTY=/dev/pts/1                  #ssh连接的终端时pts/1
USER=root                           #当前登录的用户
..........更多参数可以使用set和env命令查看.............

2.3位置参数变量

位置参数变量 作用
$n n为数字,$0表示当前 Shell 脚本程序的名称,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
$* 这个变量代表命令行中所有的参数,$把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本传的第二个参数…

vim test.sh
#!/bin/bash
echo "shell本身的名字: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "$#"
echo "$*"
echo "$@"

保存退出,给该文件执行权限 chmod+x test.sh

[root@tdm1 ~]# ./test.sh  test.sh 1 2
shell本身的名字: ./test.sh
第一个参数: test.sh
第二个参数: 1
3
test.sh 1 2    #一个个体
test.sh 1 2    #分开的三个个体

2.4预定义变量

预定义变量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非О(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
先看看$?这个变量,举个例子说明
#ls命令执行正确
[root@tdm1 ~]# ls
47.93.98.117  composetest  paramenter2.sh  readonly.sh  test.sh
#$?返回0,证明命令执行正确
[root@tdm1 ~]# echo $?
0
[root@tdm1 ~]# ls abc.txt
ls: cannot access abc.txt: No such file or directory
#没有该文件,所以返回值非0,报错
[root@tdm1 ~]# echo $?
2

$$he $!这两个预定义变量

[root@tdm1 ~]$ vi variable.sh
#!/bin/bash
echo "The current process is $$"
#输出当前进程的PID.
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍
echo "The last one Daemon process is $!"
#输出这个后台执行命令的进程的PID,也就是输出find命令的PID号

##执行脚本
[root@tdm1 ~]# sh variable.sh 
The current process is 29143
The last one Daemon process is 29144

3.只读变量

[root@localhost sh]$ vi readonly.sh
#!/bin/bash
a=10
#语法:readonly 变量名
readonly a
a=20   #会报错readonly variable
echo $a

##执行脚本
[root@tdm1 ~]# ./readonly.sh 
./readonly.sh: line 4: a: readonly variable     #显示a是只读变量
10

4.接受键盘的输入文章来源地址https://www.uudwc.com/A/0kmPW/

[root@localhost ~]$ read [选项][变量名]
选项:
	-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
	-p: “提示信息”:在等待read输入时,输出提示信息
	-t: 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
	-n: 数字:read命令只接受指定的字符数,就会执行
	-s: 隐藏输入的数据,适用于机密信息的输入
    -d: 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
    -e: 在输入的时候可以使用命令补全功能。
变量名:
变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY.
如果只提供了一个变量名,则整个输入行赋予该变量.
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字
[root@tdm1 ~]$ vi read.sh
#!/bin/bash

read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30 秒,把用户的输入保存入变量name 中
echo "Name is $name"
#看看变量“$name”中是否保存了你的输入

read -s -t 30 -p "Please enter your age: " age
#提示“请输入年龄”并等待30秒,把用户的输入保存入变量age中
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
#调整输出格式,如果不输出换行,一会的年龄输出不会换行
echo "Age is $age"

read -n 1 -t 30 -p "Please select your gender[M/F]:" gender
#提示“请选择性别”并等待30秒,把用户的输入保存入变量gender
#使用“-n1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"

##执行脚本
[root@tdm1 ~]# ./read.sh 
Please input your name: tiandameng
Name is tiandameng
Please enter your age: 

Age is 25
Please select your gender[M/F]:M

Sex is M

原文地址:https://blog.csdn.net/m0_71163619/article/details/132803842

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月12日 06:37
下一篇 2023年09月12日 06:37