Linux Shell 基础之变量

Shell 变量概述

Shell 与其他语言的对比

  • PHP 和 JAVA 主要实现功能
  • Shell 简化管理操作

什么是变量

  • 变量是计算机内存的单元,其中存放的值可以改变
  • 变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用

变量命名规则

  • 变量名必须以字母或下划线开头,名字中间只能由字母、数字和下划线组成
  • 变量名的长度不得超过 255 个字符
  • 变量名在有效的范围内必须是唯一的
  • 在 Bash 中,变量的默认类型都是字符串型

变量存储类型

  • 整型
  • 浮点型
  • 日期型
  • 字符串型

变量定义分类

  • 用户自定义变量:用户自定义的变量
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的。变量名不能自定义,变量作用固定。
  • 预定义变量:是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

Shell 变量与变量分类

  • 用户自定义变量
    • 变量定义
      • 变量名=变量值
        • x=5
        • name="Luis"
      • 变量赋值时候,变量名与变量值之间不能有空格
    • 变量调用
      • echo $x
      • echo $name
    • 变量叠加
      • x=123
      • x=”$x”456
      • x=${x}789
    • 变量查看
      • set
        • -u 如果设定此选项,调用未声明变量时会报错(默认无任何显示)
    • 变量删除
      • unset 变量名
  • 环境变量
    • 用户自定义环境变量
      • 设置环境变量
        • export 变量名=变量值
        • 变量名=变量值;export 变量名
      • 查看环境变量
        • set 查看所有变量
        • env 查看环境变量
      • 删除环境变量
        • unset 变量名
    • 系统常用的环境变量
      • HOSTNAME 主机名
      • SHELL 当前的 Shell
      • TERM 终端环境
      • HISTSIZE 历史命令条数
      • SSH_CLIENT 当前操作环境是用 ssh 连接的,这里记录客户端 IP
      • SSH_TTY ssh 连接的终端时 pts/1
      • USER 当前登录的用户
      • PATH 系统查找命令的路径
        • echo $PATH 查看 PATH 环境变量
        • PATH="$PATH":/root/sh 增加 PATH 变量的值
      • PS1 变量 命令提示符设置
        • \d 显示日期,格式为”星期 月 日”
        • \H 显示完整的主机名,如默认主机名 “localhost.localdomain”
        • \t 显示 24 小时制时间,格式为 “HH:MM:SS”
        • \A 显示 24 小时制时间,格式为 “HH:MM”
        • \u 显示当前用户名
        • \w 显示当前所在目录的完整名称
        • \W 显示当前所在目录的最后一个目录
        • \$ 提示符。如果是 root 用户会显示提示符为 “#”,如果是普通用户会显示提示符为 “$”
        • 例子 PS1='[\u@\A \w]\$ '
    • 语系变量
      • locale 查询当前系统语系(echo $LANG
        • LANG 定义系统主语系的变量
        • LC_ALL 定义整体语系的变量
      • locale -a | more 查看 Linux 支持的所有语系
      • cat /etc/sysconfig/i18n 查询系统默认语系(下次开机语系变量)
  • 位置参数变量

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

  • 预定义变量

    预定义变量|作用
    —|—
    $? | 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己决定,则证明上一个命令执行不正确)
    $$ | 当前进程的进程号
    $! | 后台运行的最后一个进程的进程号

  • 接收键盘输入

    • read [选项] [变量名]
      • -p 提示信息:在等待 read 输入时,输出提示信息
      • -t 秒数:read 命令会一直等待用户输入,使用此选项可以指定等待时间
      • -n 字符数:read 命令只接受指定的字符数,就会执行
      • -s 隐藏输入的数据,适用于机密信息的输入

Shell 变量例子

位置参数例子 1

1
2
3
4
5
6
7
8
9
#!/bin/bash
num1=$1
num2=$2
# 变量 sum 的和是 num1 加 num2
sum=$(($num1+$num2))
# 打印变量 sum 的值
echo $sum

位置参数例子 2

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 使用 $# 代表所有参数的个数
echo "A total of $# parameters"
# 使用 $* 代表所有的参数
echo "The parameters is:$*"
# 使用 $@ 也代表所有参数
echo "The parameters is:$@"

位置参数例子 3($* 与 $@ 的区别)

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
for i in "$*"
# $* 中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "The parameters is: $i"
done
for y in "$@"
# $@ 中的每个参数都看成是独立的,所以 "$@" 中有几个参数,就会循环几次
do
echo "Parameter:$y"
done

接收键盘输入例子 1

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
read -p "Please input your name: " -t 30 name
echo $name
read -p "Please input your passwd: " -s passed
echo -e "\n"
echo $passwd
read -p "Please input your sex [M/F]: " -n 1 sex
echo -e "\n"
echo $sex