Shell 学习笔记(三)-shell变量

Shell 语言是一种动态类型和弱类型语言, 因此,在Shell中无需显示地声明变量, 且变量的类型会根据不同的操作符而发生变化.

静态类型语言: 在程序编译期间就确定变量类型的语言, 如java, C++等
动态类型语言: 在程序运行期间才确定变量类型的语言, 如PHP, Python等.

一 shell变量介绍

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

  • Linux Shell中的变量分为,系统变量和用户自定义变量
  • 系统变量:HOME、PWD、USER等等 比如: echo $HOME 等等
  • 显示当前shell中所有变量:set

1.1 变量分类

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

1.2 变量名命名

  1. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  2. 等号左右两侧不能有空格,可以使用下划线“_”,变量的值如果有空格,需要使用单引号或双引号包括。如:“test=“hello world!””。其中双引号括起来的内容“$”,“(”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
  3. 不能使用标点符号,不能使用bash里的关键字(可用help命令查看保留关键字)。
  4. 环境变量建议大写,便于区分
  5. 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含变量名。
[root@mysql-112 ~]# test=111
[root@mysql-112 ~]# test="$test"222
[root@mysql-112 ~]# echo ${test}
111222
#叠加变量test,变量值变成了111222
[root@mysql-112 ~]# aaa=111
[root@mysql-112 ~]# aaa='$test'222
[root@mysql-112 ~]# echo ${aaa}
$test222

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

二 shell变量的定义

2.1 用户自定义变量:

基本语法:

  1. 定义变量:变量=值
  2. 撤销变量:unset 变量
  3. 声明静态变量:readonly变量,注意:不能unset

2.2 环境变量

2.2.1 环境变量设置

export age="18"    #使用export声明的变量即是环境变量

2.2.2 环境变量查询和删除

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

2.2.3 系统默认环境变量

env 命令查看

2.3 位置参数变量

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

$0代表脚本名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本传的第二个参数…,$*会把接收的所有参数当成一个整体对待,而$@则会区分对待接收到的所有参数。举个例子:

vim 1.sh
#!/bin/bash
for i in "$*"
#定义for循环,in后面有几个值,for会循环多少次,注意“$*”要用双引号括起来
#每次循环会把in后面的值赋予变量i
#Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
        do
                echo "The parameters is: $i"
                #打印变量$i的值
        done
x=1
#定义变量x的值为1
for y in "$@"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
#可是Shel1中把“$@”中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
        do
                echo "The parameter$x is: $y"
                #输出变量y的值
                x=$(( $x +1 ))
                #然变量x每次循环都加1,为了输出时看的更清楚
        done
echo "参数的个数 $#"
echo "脚本名字: $0"
echo "传给shell的第一个参数: $1"
echo "传给shell的第二个参数: $2"

测试: 

 2.4 预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非О(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)
vi 2.sh
#!/bin/bash
echo "The current process is $$"
echo "$?"
#输出当前进程的PID.
#这个PID就是2.sh这个脚本执行时,生成的进程的PID
find /root -name 2.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍
echo "The last one Daemon process is $!"
#输出这个后台执行命令的进程的PID,也就是输出find命令的PID号

测试: 

三 只读变量 

vi 3.sh
#!/bin/bash
a=10
#语法:readonly 变量名
echo ${a}
readonly a
a=20   #会报错readonly variable
echo $a

四 接受键盘输入

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

read命令:

[root@localhost sh]$ 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"

五 shell特殊符号 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值