Shell变量

1. shell变量简介

  • Linux Shell的变量分为,系统变量和用户自定义变量
  • 系统变量:5.2Shell变量 - 图15.2Shell变量 - 图25.2Shell变量 - 图35.2Shell变量 - 图4等等
  • 显示当前shell中所有变量:set

    1.1 变量规则

  • 变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 变量名称一般习惯为大写

    1.2 shell变量的定义

    1.2.1 基本语法

  • 定义变量:变量=值,=两边不能有空格

  • 撤销变量:unset 变量
  • 声明静态变量:readonly 变量,注意:不能unset

    1.2.2 将命令的返回值赋给变量

  • A=ls -la这里有反引号(ESC下面),运行里面的命令,并把结果返回给变量A

  • A=$(ls -la)等价于上面 ```bash [root@Tyc home]# cat var.sh

    !/bin/bash

    案例1:定义变量A

    A=100

    输出变量时加上$

    echo A=$A echo “A=$A”

案例2:撤销变量A

unset A echo “撤销之后A=$A”

案例3:声明静态变量B=2,不能撤销

readonly B=2 echo “B=$B”

案例4:将指令返回的结果赋给变量

C=date D=$(date) echo “C=$C” echo “D=$D”

[root@Tyc home]# ./var.sh A=100 A=100 撤销之后A= B=2 C=Fri Feb 25 11:16:01 CST 2022 D=Fri Feb 25 11:16:01 CST 2022

  1. <a name="d48773f9"></a>
  2. ### 1.3 使用变量
  3. - 使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
  4. ```shell
  5. your_name="qinjx"
  6. echo $your_name
  7. echo ${your_name}
  • 量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

    for skill in Ada Coffe Action Java; do
      echo "I am good at ${skill}Script"
    done
    

    1.4 静态变量

  • 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

  • 下面的例子尝试更改只读变量,结果报错:

    #!/bin/bash
    myUrl="http://www.google.com"
    readonly myUrl
    myUrl="http://www.runoob.com"
    #######
    # $/bin/sh: NAME: This variable is read only.
    

    1.5 删除变量

  • 使用 unset 命令可以删除变量。语法:unset variable_name

  • 变量被删除后不能再次使用。unset 命令不能删除只读变量。

    1.6 变量类型

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    2. 环境变量(全局变量)

    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

步骤

  • 1.在/etc/profile末尾里面声明变量,export name=xxx;

    #定义一个环境变量
    export TOM_HOME=/opt/tomcat
    
  • 2.更新配置信息,source /etc/profile;

  • 3.然后就可以在.sh脚本使用name变量。

    [root@Tyc home]# echo $TOM_HOME 
    /opt/tomcat
    
  • 基本语法

  • export 变量名=变量值:将shell变量输出为环境变量
  • source 配置文件:让修改后的配置文件信息立即生效
  • echo $变量名:查询环境变量的值

    3. Shell 注释

  • 以 # 开头的行就是注释,会被解释器忽略。

  • 通过每一行加一个 # 号设置多行注释,像这样:

    #--------------------------------------------
    # 这是一个注释
    # author:菜鸟教程
    # site:www.runoob.com
    # slogan:学的不仅是技术,更是梦想!
    #--------------------------------------------
    ##### 用户配置区 开始 #####
    #
    #
    # 这里可以添加脚本描述信息
    #
    #
    ##### 用户配置区 结束  #####
    

    多行注释

  • 多行注释还可以使用以下格式:

    :<<EOF
    注释内容...
    注释内容...
    注释内容...
    EOF
    
  • EOF 也可以使用其他符号: ```shell :<<’ 注释内容… 注释内容… 注释内容… ‘

:<<! 注释内容… 注释内容… 注释内容… !

<a name="b1cc41a1"></a>
## 4. 位置参数,预定义变量
<a name="T9Vp6"></a>
#### 位置参数

- 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
- n 代表一个数字,0为命令本身,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推,10以上的参数需要用大括号包含,如:${10}
```shell
#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

:<<!
chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
!
  • 另外,还有几个特殊字符用来处理参数: | 参数处理 | 说明 | | —- | —- | | $# | 传递到脚本的参数个数 | | $ | 以一个单字符串显示所有向脚本传递的参数。如”$“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。 | | $$ | 脚本运行的当前进程ID号 | | $! | 后台运行的最后一个进程的ID号 | | $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “5.2Shell变量 - 图5n” 的形式输出所有参数。 | | $- | 显示Shell使用的当前选项,与set命令功能相同。 | | $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
[root@Tyc home]# cat mywork.sh 
#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

:<<!
$chmod +x test.sh
$./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
!

[root@Tyc home]# cat mywork1.sh 
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"
[root@Tyc home]# ./mywork1.sh 100 200
0=./mywork1.sh 1=100 2=200
所有的参数=100 200
100 200
参数的个数=2

预定义变量

  • 用的不是很多,了解。
  • 注意!!!以后台方式运行一个脚本,需要在脚本末尾加一个地址符&

Snipaste_2022-02-25_14-05-54.png

[root@Tyc home]# ll
total 16
-rw-r--r-- 1 root root  32 Feb 24 21:00 hello.sh
-rwxr--r-- 1 root root  96 Feb 25 14:01 mywork.sh
-rwxr--r-- 1 root root 242 Feb 25 14:10 preVar.sh
-rwxr--r-- 1 root root 381 Feb 25 13:33 var.sh
[root@Tyc home]# cat preVar.sh 
#!/bin/bash
echo "当前执行的进程号id=$$"
#以后台方式运行一个脚本,这个时候需要加地址符&,并获取进程号
/home/mywork.sh &
echo "最后一个后台方式运行的进程号id=$!"
echo "执行的结果是=$?"

[root@Tyc home]# ./preVar.sh 
当前执行的进程号id=8946
最后一个后台方式运行的进程号id=8947
执行的结果是=0
[root@Tyc home]# 0=/home/mywork.sh 1= 2=
所有的参数=

参数的个数=0