文章目录
- 一,shell变量是什么
- 二,自定义变量
- 1 . 查看和引用变量的值
- 2 . echo选项
- 3 . unset
- 4 . 特殊符号
- 5 . 括号
- 三,交互式定义变量
- 1 . read
- 2 . read 选项
- 四,变量的范围
- 1 . export命令
- 五,数值变量的运算及特殊变量
- 1 . 可以算加减乘除
- 2 . 变量运算
- 3 . 使用shll脚本运算
- 4 . (())
- 4.1 基本用法
- 5 . []
- 六,let命令
- 七,dc
- 八,环境变量
- 1 . 环境变量的特点
- 2 . 常见的环境变量
- 九,只读变量
- 十,位置变量
- 十一,预定义变量
一,shell变量是什么
- 用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量。
- 常见 Shell 变量的类型有:自定义变量、环境变量、只读变量、位置变量、预定义变量。
二,自定义变量
- 自定义变量(User-defined variables)是由用户在脚本中定义并赋值的变量。它们用于存储和操作数据,可以是字符串、数字、数组等类型。自定义变量的使用可以提高脚本的可读性和可维护性。
- 在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可。
格式
符号两边不能有空格,名称中不能包含特殊符号,如 + - * / ? % & #
变量名:临时存放数据的地方
变量值:临时的可变化的数据
1 . 查看和引用变量的值
在变量名称前面加符号$,就可以引用变量的值,使用echo命令查看
例
[root@localhost ~]# lllllll=123456
[root@localhost ~]# xxxxxxx=xl
[root@localhost ~]# echo $lllllll $xxxxxxx
123456 xl
2 . echo选项
-n 表示不换行输出
-e 输出转义字符,将转义后的内容输出到屏幕上,转义符\c
(不换行输出)、\n
(换行)、\t
(插入制
例
[root@localhost ~]# echo -e "hello\n"
hello[root@localhost ~]# echo -e "hello\t"
hello
[root@localhost ~]# echo -n hello
hello[root@localhost ~]#
3 . unset
取消定义
例
[root@localhost ~]# asa=1152
[root@localhost ~]# echo $asa
1152
[root@localhost ~]# unset asa
[root@localhost ~]# bsb=1152
[root@localhost ~]# echo $bsb
1152
4 . 特殊符号
**双引号 “” **:主要用于界定字符串,特别是当内容中包含空格时。可识别变量直接调用
**单引号 ‘’ **:用于界定包含特殊字符(如$、“、\等)的字符串。不识别变量
**反引号 `` **:用于命令替换,将命令的输出结果赋值给变量。
例
[root@localhost ~]# echo $"how are you"
how are you
[root@localhost ~]# vwesion=2.9.9.9
[root@localhost ~]# echo "$pyver $vwesion"
python 2.9.9.9
[root@localhost ~]# echo "$vvi"
11624
[root@localhost ~]# vvi=11624
[root@localhost ~]# echo '$vvi'
$vvi
[root@localhost ~]# which usermod
/usr/sbin/usermod
[root@localhost ~]# ls -lh `which usermod`
-rwxr-x---. 1 root root 112K 11月 6 2016 /usr/sbin/usermod
[root@localhost ~]# date +%T
16:25:21
[root@localhost ~]# time=`date +%T`
[root@localhost ~]# echo $time
16:25:24
5 . 括号
** ** {} 当变量名称容易和紧跟其后的字符混淆时,可以使用大括号“{}”将其括起来,使用符号{}引用变量,括号呢的变量名必须要有赋予值,不赋值查看引用不了
()可以分隔变量值,序列顺序值。确定变量的范围
[root@localhost ~]# which useradd
/usr/sbin/useradd
[root@localhost ~]# rpm -qf $(which useradd)
shadow-utils-4.1.5.1-24.el7.x86_64
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
[root@localhost ~]# lllllll=123456
[root@localhost ~]# xxxxxxx=xl
[root@localhost ~]# echo ${lllllll}77
12345677
[root@localhost ~]# echo ${lllllll} 7.7.7
123456 7.7.7
三,交互式定义变量
交互式定义变量是指在脚本运行过程中,通过提示用户输入数据并将其赋值给变量。这种方式使脚本能够与用户进行互动,从而动态获取输入数据并在后续的脚本操作中使用。
1 . read
read
命令是 Bash 内置的用于从标准输入(通常是键盘)读取一行数据并赋值给变量的命令。用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
例
[root@localhost ~]# read yyds
you xi
[root@localhost ~]# echo $yyds
you xi
2 . read 选项
-p 提示用户的信息
-n 定义字符数
-s 不显示用户输入的内容,常用于输入密码 read -s -p “input your password:” pass
-t 定义超时时间,超过多长时间没输自动退出
[root@localhost ~]# read -p "请输入姓名:" name
请输入姓名:zhangsan
[root@localhost ~]# read -s -p "请输入密码:" passwd
请输入密码:[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo "lisi like cat" > lisi.txt
[root@localhost ~]# read -p "请输入李四的喜欢什么:" like < lisi.txt
[root@localhost ~]# echo $like
lisi like cat
stty -echo 关闭屏幕回显
stty echo 开启屏幕回显
四,变量的范围
默认情况下,新定义的变量只在当前的 Shell 环境中有效,被称为局部变量,当进入子程序或新的子 Shell 环境时,局部变量将无法再使用
1 . export命令
为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
[root@localhost ~]# time=123
[root@localhost ~]# echo $time
123
[root@localhost ~]# bash
[root@localhost ~]# echo $time[root@localhost ~]# time=123
[root@localhost ~]# echo $time
123
[root@localhost ~]# export time
[root@localhost ~]# bash
[root@localhost ~]# echo $time
123
[root@localhost ~]#
使用 export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了
env查看用户当前环境变量
export time=456
再次env就能看到了
export -n 456取消定义的全局变量变成局部变量
[root@localhost ~]# time=123
[root@localhost ~]# echo $time
123
[root@localhost ~]# export time
[root@localhost ~]# bash
[root@localhost ~]# echo $time
123
[root@localhost ~]# export time="456"
[root@localhost ~]# enc
[root@localhost ~]# echo $time
456
[root@localhost ~]# env
XDG_SESSION_ID=126
HOSTNAME=localhost.localdomain
time=456
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.72.1 52813 22
SSH_TTY=/dev/pts/0
USER=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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=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:*.webm=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:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=4
LOGNAME=root
SSH_CONNECTION=192.168.72.1 52813 192.168.72.20 22
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
五,数值变量的运算及特殊变量
在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算整数值的运算主要通过内部命令 expr 进行运算符与变量之间必须有一个空格。
1 . 可以算加减乘除
[root@localhost ~]# expr 1 + 1
2
[root@localhost ~]# expr 2 \* 2
4
[root@localhost ~]# expr 2 '*' 2
4
2 . 变量运算
[root@localhost ~]# x=34
[root@localhost ~]# y=32
[root@localhost ~]# expr $y +20
expr: 语法错误
[root@localhost ~]# expr $y + 20
52
[root@localhost ~]# expr $y + $y
64
[root@localhost ~]# expr $y - $x
-2
[root@localhost ~]# expr $y \* $x
1088
[root@localhost ~]# expr $y % $x 取余
32
[root@localhost ~]# echo lll5
lll5
[root@localhost ~]# lll5=`expr $x \* $y \* $y`
[root@localhost ~]# echo $lll5
34816
[root@localhost ~]#
3 . 使用shll脚本运算
[root@localhost ~]# vim first.sh
#!/bin/bash
#1,定义输出的数字
read -p"请输入第一个数字:" num1
read -p"请输入第一个数字:" num2
#2, 定义执行加算法
expr $num1 + $num2
#
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ./first.sh
请输入第一个数字:15
请输入第一个数字:25
40
或者是
[root@localhost ~]# vim first.sh
#!/bin/bash
#1,定义输出的数字
read -p "请输入第一个数字:" num1
read -p "请输入第一个数字:" num2
#2, 定义执行加算法
num9=`expr $num1 + $num2`echo "求和数为:" $num9
#
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ./first.sh
请输入第一个数字:30
请输入第一个数字:17
求和数为: 47
4 . (())
在 Linux 中,双圆括号 (( ))
是用于执行算术运算的一种方式。它提供了一种简洁且高效的方式来进行整数运算,(()) 必须要和echo在一起用因为他只能运算无法输出结果
4.1 基本用法
- 算术运算:可以在
(( ))
中进行加、减、乘、除、取余等操作。 - 赋值操作:可以在
(( ))
中对变量进行赋值。 - 条件测试:可以在
(( ))
中进行条件测试,用于 if 语句或循环。
[root@localhost ~]# echo $((1+1))
2
[root@localhost ~]# echo $((5-2))
3
[root@localhost ~]# a=44
[root@localhost ~]# b=17
[root@localhost ~]# echo $((a-b))
27
[root@localhost ~]# echo $((b-a))
-27
5 . []
整数运算
[root@localhost ~]# echo $[10*10][]里的*不需要转义100
[root@localhost ~]# echo $[10%4]
2
[root@localhost ~]# echo $[10/4]
2
[root@localhost ~]# echo $[10/12]
0
6 . 变量运算
[root@localhost ~]# a=44
[root@localhost ~]# b=17
[root@localhost ~]# c=15
[root@localhost ~]# echo $[10*10]
100
[root@localhost ~]# echo $[10%4]
2
[root@localhost ~]# echo $[10/4]
2
[root@localhost ~]# echo $[10/12]
0
[root@localhost ~]# echo $[$a+$b]
61
[root@localhost ~]# echo $[a+b]
61
[root@localhost ~]# echo $[a+b*c]
299
[root@localhost ~]# echo $[(a+b)*c]
915
[root@localhost ~]# echo $[a%b]
10
[root@localhost ~]# echo $[a/b]
2
六,let命令
let
命令是 Bash 中用于执行算术运算的一个内置命令。它可以对整数进行加减乘除等算术运算,且可以处理多个表达式。
[root@localhost ~]# n=0;let n=n+1;echo $n
1
[root@localhost ~]# let n+=3
[root@localhost ~]# echo $n
4
[root@localhost ~]# let n=n**3
[root@localhost ~]# echo $n
64
[root@localhost ~]# let n++
[root@localhost ~]# echo $n
65
[root@localhost ~]# let n--
[root@localhost ~]# echo $n
64
[root@localhost ~]# echo $[n++]
64
[root@localhost ~]# echo $n
65
[root@localhost ~]#
常用的运算表达式:
i=KaTeX parse error: Undefined control sequence: \* at position 10: (expr 12 \̲*̲ 5) i=((12 * 5))
i=[12 * 5]
let i=12*5
i++ 相当于 i= [ [ [i+1]
i-- 相当于 i= [ [ [i-1]
i+=2 相当于 i= [ [ [i+2]
七,dc
dc
是一个支持任意精度算术运算的逆波兰计算器。dc
原生支持整数和浮点数,并且可以处理复杂的数学运算。与其他计算器不同,dc
使用后缀表示法(也称为逆波兰表示法),这意味着操作符在操作数之后。
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10/3
3
11/3
3
scale=5
10/3
3.33333
11/3
3.66666
12/3
4.00000
或者
[root@localhost ~]# echo "scale=5;11/3|bc"
scale=5;11/3|bc
[root@localhost ~]# echo "scale=5;11/3"|bc
3.66666
[root@localhost ~]# echo "4^2"|bc
16
[root@localhost ~]# echo "5^2"|bc
25
[root@localhost ~]# a=24
[root@localhost ~]# b=7
[root@localhost ~]# echo "$a*$b"|bc
168
[root@localhost ~]# echo "$a/$b"|bc
3
[root@localhost ~]# echo "scale=3;$a/$b"|bc
3.428
[root@localhost ~]# echo "2>2"|bc 0为假
0
[root@localhost ~]# echo "2==2"|bc 1为真
1
八,环境变量
环境变量是操作系统用于存储环境配置的动态命名值。这些变量可以影响系统和应用程序的行为。环境变量可以在系统范围内定义,也可以在用户会话或特定的进程中定义。它们通常用于配置操作系统的运行环境和应用程序的运行参数。
1 . 环境变量的特点
1.1 全局性:环境变量在创建后,可以在创建它们的进程及其子进程中全局访问。
1.2动态性:环境变量的值是动态的,可以在运行时进行修改。
1.3配置和管理:环境变量通常用于配置系统环境、用户环境和应用程序行为。
2 . 常见的环境变量
PATH
:定义可执行文件的搜索路径。HOME
:当前用户的主目录。USER
:当前登录的用户名。SHELL
:当前用户使用的默认 shell 程序。LANG
:系统的语言和区域设置。PWD
:当前工作目录。EDITOR
:默认文本编辑器。
[root@localhost ~]# echo $RANDOM
8963
[root@localhost ~]# echo $RANDOM
16952
[root@localhost ~]# echo $RANDOM
31165
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH="$PATH:/root"
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost /home]# vim test2.sh
echo "hell 556"
~
:wq
[root@localhost /home]# chmod +x test2.sh
[root@localhost /home]# ./test2.sh
hell 556
[root@localhost /home]# cd /opt
[root@localhost /opt]#test2.sh
bash: test2.sh: 未找到命令...
[root@localhost /home]# PATH="$PATH:/home"
[root@localhost /home]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root:/home
[root@localhost /home]# test2.sh
hell 556
[root@localhost /home]# cd /opt
[root@localhost /opt]# test2.sh
hell 556
九,只读变量
Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变 量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只 读变量主要用于变量值不允许被修改的情况,只能退出
[root@localhost ~]# tttt=123
[root@localhost ~]# readonly tttt
[root@localhost ~]# echo $tttt
123
[root@localhost ~]# tttt=456
-bash: tttt: 只读变量
[root@localhost ~]# unset tttt
-bash: unset: tttt: 无法反设定: 只读 variable
[root@localhost ~]# exit
十,位置变量
执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。 位置变量也称为位置参数,用$1、$2、$3、…、$9 表示,命令或脚本本身的名称使用“$0”表示
[root@localhost ~]# vim user.sh
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@localhost ~]# bash user.sh sj 123
更改用户 sj 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#
[root@localhost ~]# id sj
uid=1001(sj) gid=1001(sj) 组=1001(sj)
[root@localhost ~]# vim cs.sh
#!/bin/bash
# 使用 expr 命令进行算术运算,并将结果赋给变量
SUM=`expr $1 + $2`# 输出结果
echo "$1 + $2 = $SUM"
[root@localhost ~]# chmod +x cs.sh
[root@localhost ~]# ./cs.sh 12 35
12 + 35 = 47
十一,预定义变量
预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容,这些内容当做一个整体
$@:表示列出所有位置参数,但是是以单个的形式的列出
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$!:返回最后一个后台进程的进程号
[root@localhost ~]# vim demo01.sh
#!/bin/bash
echo $1
echo “$0 表示当前执行的脚本或程序的名称”
echo “$# 表示命令行中位置参数的个数”
echo “$* 所有位置参数的内容,这些内容当做一个整体”
echo “$@ 表示列出所有位置参数,但是是以单个的形式的列出”
~
[root@localhost ~]# chmod +x demo01.sh
[root@localhost ~]# ./demo01.sh 1 2 3 4 5 6
1
“./demo01.sh 表示当前执行的脚本或程序的名称”
“6 表示命令行中位置参数的个数”
“1 2 3 4 5 6 所有位置参数的内容,这些内容当做一个整体”
“1 2 3 4 5 6 表示列出所有位置参数,但是是以单个的形式的列出”
[root@localhost ~]# vim demo02.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "当前脚本的第一个参数是$1"
echo "当前脚本的第二个参数是$2"
echo "当前脚本一共有$#个参数"
~
[root@localhost ~]# chmod +x demo02.sh
[root@localhost ~]# ./demo02.sh 1 2 3 4
当前脚本名称为./demo02.sh
当前脚本的第一个参数是1
当前脚本的第二个参数是2
当前脚本一共有4个参数