运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

  • Python

  • Shell

    • 前言

    • shell基础

      • 第一个shell脚本
      • shell变量
        • 1. 系统变量
        • 2. 普通变量与临时环境变量
        • 3. 位置变量
        • 4. 特殊变量
        • 5. 变量引用
          • 5.1 自定义变量与引用
          • 5.2 将命令结果作为变量值
        • 6. 双引号和单引号
        • 7. 注释
    • Shell高级

    • shell三剑客

  • Java

  • Vue

  • 前端

  • 编程浅尝
  • Shell
  • shell基础
lyndon
2022-11-06
目录

shell变量

# 1. 系统变量

在命令行提示符直接执行 env、set 查看系统或环境变量。

env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量,可以通过 export 导出成用户变量。

Shell 脚本时常用的系统变量:

  • $SHELL 默认 Shell
  • $HOME 当前用户家目录
  • $IFS 内部字段分隔符
  • $LANG 默认语言
  • $PATH 默认可执行程序路径
  • $PWD 当前目录
  • $UID 当前用户 ID
  • $USER 当前用户
  • $HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
  • $RANDOM 随机生成一个 0 至 32767 的整数
  • $HOSTNAME 主机名

# 2. 普通变量与临时环境变量

普通变量定义:VAR=value

临时环境变量定义:export VAR=value

变量引用:$VAR

区别:

Shell 进程的环境变量作用域是 Shell 进程,当 export 导入到系统变量时,则作用域是 Shell 进程及其 Shell 子进程。

image-20221106162925894

ps axjf 输出的第一列是 PPID(父进程 ID),第二列是 PID(子进程 ID)。当 SSH 连接 Shell 时,当前终端 PPID(-bash)是 sshd 守护程序的 PID(root@pts/0),因此在当前终端下的所有进程的 PPID 都是-bash 的 PID,比如执行命令、运行脚本。所以当在-bash 下设置的变量,只在-bash 进程下有效,而-bash 下的子进程 bash 是无效的,当export 后才有效。

进一步说明:再重新连接 SSH,去除上面定义的变量测试下

image-20221106163115606

所以在当前 shell 定义的变量一定要 export,否则在写脚本时,会引用不到。还需要注意的是退出终端后,所有用户定义的变量都会清除。

# 3. 位置变量

位置变量指的是函数或脚本后跟的第 n 个参数。

$1-$n,需要注意的是从第 10 个开始要用花括号调用,例如 ${10}

shift 可对位置变量控制,例如:

#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"

# bash test.sh a b c
1: a
2: c
3:
1
2
3
4
5
6
7
8
9
10
11

每执行一次 shift 命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动 n 位。

# 4. 特殊变量

  • $0 脚本自身名字
  • $? 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败
  • $# 位置参数总数
  • $* 所有的位置参数被看做一个字符串
  • $@ 每个位置参数被看做独立的字符串
  • $$ 当前进程 PID
  • $! 上一条运行后台进程的 PID

# 5. 变量引用

赋值运算符

  • = 变量赋值
  • += 两个变量相加

# 5.1 自定义变量与引用

# VAR=123
# echo $VAR
123

# VAR+=456
# echo $VAR
123456
1
2
3
4
5
6
7

Shell 中所有变量引用使用$符,后跟变量名。

有时个别特殊字符会影响正常引用,那么需要使用${VAR},例如:

# VAR=123
# echo $VAR
123

# echo $VAR_ # Shell 允许 VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回
空

# echo ${VAR}
123

#还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:
# echo $VAR456

# echo ${VAR}456
123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 5.2 将命令结果作为变量值

# VAR=`echo 123`
# echo $VAR
123

# VAR=$(echo 123)
# echo $VAR
123
1
2
3
4
5
6
7

这里的反撇号等效于$(),都是用于执行 Shell 命令。

# 6. 双引号和单引号

在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令:

# VAR=1 2 3
-bash: 2: command not found

# VAR="1 2 3"
# echo $VAR
1 2 3

# VAR='1 2 3'
# echo $VAR
1 2 3
1
2
3
4
5
6
7
8
9
10

看不出什么区别,再举个说明:

# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3

# VAR='1 2 $N'
# echo $VAR
1 2 $N
1
2
3
4
5
6
7
8

单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。

# 7. 注释

Shell 注释也很简单,只要在每行前面加个#号,即表示 Shell 忽略解释。

上次更新: 2022/11/06, 20:20:54
第一个shell脚本
Shell字符串处理之${}

← 第一个shell脚本 Shell字符串处理之${}→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式