Shell脚本的变量

发布时间:2024年01月24日

目录

一、变量

1.变量的作用

2.变量的类型

3.自定义变量

? ? ? 3.1自定义变量名要求

? ? ? 3.2定义与查看变量

? ?? ?3.3使用的引号

? ? ? 3.4read -p

4.整数变量的运算

5.环境变量 的全局配置文件

6.只读变量

7.位置变量

8.预定义变量

二、测试

1.test

2.比较整数数值

3.字符串比较

4.逻辑测试


一、变量

1.变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义

  • 变量值:能够根据用户设置、系统环境的变化而变化

2.变量的类型

  • 自定义变量:由用户自己定义、修改和使用

  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改??? 有些规定好的变量 放在那里让你使用

3.自定义变量

? ? ?3.1自定义变量名要求

区分大小写

不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

只能使用数字、字母及下划线,且不能以数字开头

不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

大驼峰 StudentFirstName

小驼峰 studentFirstName

下划线 student_name

? ? ? 3.2定义与查看变量

定义变量:

变量名以字母或下划线开头,区分大小写,建议全大写

? (变量名=变量值)

echo $:查看变量值

[root@localhost ~]#name=my   定义变量name为my
[root@localhost ~]#echo $name 输出变量值
my

[root@localhost ~]#name=xuzh   重新定义变量name为xuzh
[root@localhost ~]#echo $name   输出变量值
xuzh  

使用{}定义变量的范围,将变量名分隔出来

[root@localhost ~]#class=ky35          定义班级为ky35
[root@localhost ~]#studentid=26         学号为26
[root@localhost ~]#echo $class$studentid    输出班级和学号
ky3526 
[root@localhost ~]#echo $classstudentid    此时$认为classstudentid为一个变量 但是没有这个变量所以输出为空


[root@localhost ~]#echo ${class}studentid    加上{}会识别grade变量{}内的为需要输出的变量范围
ky35studentid

删除变量unset

[root@localhost ~]#n=1     设置变量n
[root@localhost ~]#echo $n
1
[root@localhost ~]#unset n   删除变量
[root@localhost ~]#echo $n

[root@localhost ~]#

? ?? ?3.3使用的引号

  • 双引号" ":允许通过$符号引用其他变量值
  • 单引号' ':禁止引用其他变量值,$视为普通字符,
  • 反撇号``:命令替换,提取命令执行后的输出结果与$( )效果相同
  • {}可以分隔变量值
  • 定义变量时中间有特殊字符时 比如空格 用单引号或者双引号括起来

双引号与单引号

[root@localhost ~]#name=xuzhou
[root@localhost ~]#echo "$name"
xuzhou
[root@localhost ~]#echo '$name'
$name

单引号不识别$符号,有空格或者特殊字符可以使用

[root@localhost ~]#name='m y'
[root@localhost ~]#echo $name
m y

? ? ? 3.4read -p

从键盘输入的内容变成变量

[root@localhost opt]# read -p "现在的时间是" time
现在的时间是9点         
[root@localhost opt]# echo $time
9点
[root@localhost opt]# vim 1.sh
#!/bin/bash
echo -n "请输入你的信息"
read info
echo $info

[root@localhost opt]# bash 1.sh 
请输入你的信息ky15
ky15
[root@192 ~]# read -p "是否覆盖当前文件 (yes/no)" ACK
是否覆盖当前文件 (yes/no)yes
[root@192 ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
[root@192 ~]# read -p "是否覆盖当前文件 (yes/no)" ACK
是否覆盖当前文件 (yes/no)no
[root@192 ~]# [ $ACK = "no" ] && echo "不覆盖"
不覆盖

4.整数变量的运算

shell默认只支持整数的运算

运算符:+?加法、-?减法、*?乘法、/除法、%?取余

  1. 格式:expr 变量1 运算符 变量2 [运算符 变量3](计算乘法时,需要使用“\”转义符)

  2. var=$ ( expr变量1运算符变量2)

  3. var=$((变量1 运算符 变量2))

  4. var=$[ 变量1 运算符 变量2 ]

  5. let var=变量1 运算符 变量2

  6. [root@localhost ~]# echo $[1+2]
    3
    [root@localhost ~]# echo $((2+3))
    5
    [root@localhost ~]# echo $(expr 12 \* 3)
    36
    [root@localhost ~]# let i=11+3
    [root@localhost ~]# echo $i
    14
    [root@localhost ~]# echo $(expr 12 + 3)
    15

5.环境变量 的全局配置文件

使用env查看环境变量

[root@localhost ~]#env
XDG_SESSION_ID=91
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.21.1 54457 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/2

常用环境变量

  • $USER 表示用户名称
  • $HOME 表示用户的宿主目录
  • $LANG 表示语言和字符集
  • $PWD 表示当前所在工作目录
  • $PATH 表示可执行用户程序的默认路径
  • 环境变量:
  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

  • 一般只在系统配置文件中使用,在脚本中较少使用

  • 四个系统级的环境配置变量/etc/profile ?/etc/bashrc 或者(自己家目录中的)/root/.bash_profile/ root/.bashrc .bash_profile ?/root/.bashrc

    /etc/profile?
    系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)

    ~/.bash_profile ~/.bashrc
    不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc ~/.bashrc 当前用户每切换一个shell环境都会自动执行

    /etc/bashrc
    /etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行

[root@localhost ~]# vim /etc/profile
.....................省略到行末添加
export PATH=$PATH:/root
source立即生效或 .
[root@localhost opt]# source /etc/profile

修改系统默认的命令数
[root@localhost opt]# echo $HISTSIZE 
1000
[root@localhost opt]# vim /root/.bash_profile
export HISTSIZE=200
[root@localhost opt]# source /root/.bash_profile 
[root@localhost opt]# echo $HISTSIZE 
200

6.只读变量

变量值不允许修改(重新赋值)的情况

法使用 unset删除

最快方法重启:

[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name 
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name 
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量

7.位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

[root@test1 ~]# vim 1.sh      
#!/bin/bash
echo "$1"            位置1
echo "$2"            位置2
echo "${10}"         位置10
echo "$10"           位置1和0
echo "$*"            将所有项当成一个值
echo "$@"            所有项
echo "$0"            脚本自身
echo "$#"            后面参数的个数
[root@test1 ~]# ./1.sh {1..10}
1 
2
10
10
1 2 3 4 5 6 7 8 9 10



$0 表示当前的脚本名称

[root@test1 ~]# vim weizhi.sh
#!/bin/bash
sum=`expr $1 + $2`
echo "$1+$2=$sum"
[root@test1 ~]# chmod +x weizhi.sh
[root@test1 ~]# ./weizhi.sh 12 34 56
12+34=46
[root@test1 ~]#cat qiuhe.sh
#!/bin/bash
i=$1
m=$2
sum=0
let sum=$[i+m]
echo $sum

8.预定义变量

bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有

  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

  • $#:表示命令行中位置参数的总个数

  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字

  • $$:当前bash的进程id

  • $!: 后台任务最后一个id

[root@localhost data]#bash test.sh {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost data]#bash 1.sh {a..z}
at的结果是
a
[root@localhost data]#bash 2.sh {a..z}
星的结果是
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@test1 ~]# vim 1.sh      
#!/bin/bash
echo "$*"            将所有项当成一个值
echo "$@"            独立个体
echo "$#"            后面参数的个数

二、测试

1.test

test 测试文件的表达式 是否成立

格式1:test ?条件表达式
格式2:[ ?条件表达式 ?]
注意[]空格,否则会失败
测试 是否成功使用 $? ?返回值
[ 操作符 文件或目录 ]
help test

操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist) ??
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件

属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

2.比较整数数值

[ 整数1 -操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数

  • -ne:第一个数不等于(Not Equal)第二个数

  • -gt:第一个数大于(Greater Than)第二个数

  • -lt:第一个数小于(Lesser Than)第二个数

  • -le:第一个数小于或等于(Lesser or Equal)第二个数

  • -ge:第一个数大于或等于(Greater or Equal)第二个数

[root@test1 ~]# a=2        实例
[root@test1 ~]# b=3
[root@test1 ~] [ $a -eq $b ]
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ 2 -le 3 ]
[root@test1 ~]# echo $?
0

3.字符串比较

常用的测试操作符

  • =:字符串内容相同

  • !=:字符串内容不同,! 号表示相反的意思

  • -z:字符串内容为空

  • -n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

[root@localhost data]#str1=xu
[root@localhost data]#str2=zhou
[root@localhost data]#[ $str1 = $str2 ]
[root@localhost data]#echo $?
1

[root@localhost etc]# [ $USER = root ]&& echo true
true
[root@localhost etc]# [ $USER != root ]&& echo true

[root@localhost etc]# read -p "yes/no:" ack
yes/no:
[root@localhost etc]# echo $ack 

[root@localhost etc]# [ -z $ack ] && echo true 
true

4.逻辑测试

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...

格式2:命令1 操作符 命令2 ...

第一个要真 第二 个也要真 才能是真

如果第一个为假 ,整个 就为假 不用执行下个操作

cmd1 && cmd2

一 真即为真

如果第一个 为真 那么 不用执行第二个

第一个为假 ,才需要执行第二个

cmd1 || cmd2

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真

  • -o或||:逻辑或,“或者”的意思一真即为真

  • !:逻辑否

1.短路与&&

CMD1 短路与 CMD2 ? ? ?&& ? 同时满足命令1 和命令2 的要求 ?才会返回正确


逻辑与
第一一个命令为真,才需要执行第二个命令
全真才为真,一假即为假

第一个命令假了,一定假了 ? ?

逻辑或
一真即为真,全假才为假
第一个命令为真,不需要执行第二个命令了, ?一定为真了
第一个命令为假,需要执行第二个命令来看 整个式子的结果


全真才为真 ?一假即为假 ? ? ?
第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果?
第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2

2.短路或| |

CMD1 短路或 CMD2
一真即为真
第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

文章来源:https://blog.csdn.net/Miraitowa_xu/article/details/135776106
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。