1.1 变量

name="JTZ" # 定义一个变量
echo $name # 输出变量
  • 在 Bash 中为 弱类型的变量

  • $ : 取出变量值

变量引用

#!/bin/bash

# 定义一个简单的变量,并输出

name=JTZ
echo $name # 输出 name 的值为 JTZ

#-----------------------------------------
# 注意:
# 在初始化变量时赋值号的两层不允许用空格值出现
#-----------------------------------------

# 输出字符串
echo name       # 输出 name
echo "name"     # 输出 name

# 1. 变量引用
echo $name      # 输出变量的值 JTZ
echo ${name}
# 2. 字符串内变量引用
echo "我的名字是: $name"       # 输出 我的名字是 JTZ
echo '$name'    # 这会输出 $name
# 3. 只读变量
readonly name
# 4. 删除变量
unset name

#---------------------------------------
# 注意:
# 单引号会禁用掉(转义)变量的应用,这将会导致 $ 以普通字符串的形式输出
#---------------------------------------


# 空值 & NULL
name=           # 这表明将 name  的值设置为 name=""
unset name      # 这是删除变量的命令,其结果和上面 name="" 相同

exit #执行结束
exit $? # 也是执行结束只不过 $? 是最后一条命令退出状态,执行成功为 0 否则其他

变量赋值

#!/bin/bash

# 1. 常规的变量赋值
name="JTZ"

# 2. 读取命令行输入作为参数的值
echo "请求输入 name 的值: "
read name

# 3. 使用命令替换结构
a=`echo HELLO!` # 将 echo 结构交给 a 变量
echo $a

b=`echo HELLO`
echo $b

#------------------------------------------
# 注意:
# 在使用命令替换结构中包含 ! 在命令行中使用有效
# 因为不加 ! 会触发 Bash  的 history 机制
# 在 SHELL 脚本内, Bash 的历史机制默认关闭
#------------------------------------------

a=`ls -l`
# 不带引号引用会移除所有的空格字符
echo $a
echo "$a"

# 4. 使用 $(...) 形式赋值, 这是一个与反引号不同的新形式
b=$(ls -l)

# 5. 位置参数
#------------------------------------------
# 注意:
# $0 表示脚本名称, $1~$9 表示第 1~9 个参数 第十个参数之后需要使用 ${n} 表示
# $* 和 $@ 代表所有位置参数
# $# 表示传入参数的个数
# $$ 表示当前进行的 PID
# 
#------------------------------------------

echo "脚本名称为: $0"
echo "第一个参数为:$1"
echo "传入参数的个数: $#"

# 扩展
# 使用 shift 命令可以将全体位置参数向左移一位, 重新赋值。$1 <--- $2, $2 <--- $3, $3 <--- $4,以此类推
until [ -z "$1" ]  # 直到访问完所有的参数
do
  echo -n "$1 "
  shift 1  # 这里默认是 1
done

echo               # 换行。

# 那些被访问完的参数又会怎样呢?
echo "$2"
# 什么都不会被打印出来。
# 当 $2 被移动到 $1 且没有 $3 时,$2 将会保持空。
# 因此 shift 是移动参数而非复制参数。

exit #执行结束
exit $? # 也是执行结束只不过 $? 是最后一条命令退出状态,执行成功为 0 否则其他

Bash 弱类型变量

  • 本质上说, Bash 变量是字符串

  • Bash 是否允许变量进行算术运算和比较,决定因素是变量值是否只含有数字

#!/bin/bash
# int-or-string.sh

a=2334                   # 整数。
let "a += 1"
echo "a = $a "           # a = 2335
echo                     # 依旧是整数。


b=${a/23/BB}             # 将 "23" 替换为 "BB"。
                         # $b 变成了字符串。
echo "b = $b"            # b = BB35
declare -i b             # 将其声明为整数并没有什么卵用。
echo "b = $b"            # b = BB35

let "b += 1"             # BB35 + 1
echo "b = $b"            # b = 1
echo                     # Bash 认为字符串的"整数值"为0。

c=BB34
echo "c = $c"            # c = BB34
d=${c/BB/23}             # 将 "BB" 替换为 "23"。
                         # $d 变为了一个整数。
echo "d = $d"            # d = 2334
let "d += 1"             # 2334 + 1
echo "d = $d"            # d = 2335
echo


# 如果是空值会怎样呢?
e=''                     # ...也可以是 e="" 或 e=
echo "e = $e"            # e =
let "e += 1"             # 空值是否允许进行算术运算?
echo "e = $e"            # e = 1
echo                     # 空值变为了一个整数。

# 如果时未声明的变量呢?
echo "f = $f"            # f =
let "f += 1"             # 是否允许进行算术运算?
echo "f = $f"            # f = 1
echo                     # 未声明变量变为了一个整数。
#
# 然而……
let "f /= $undecl_var"   # 可以除以0么?
#   let: f /= : syntax error: operand expected (error token is " ")
# 语法错误!在这里 $undecl_var 并没有被设置为0!
#
# 但是,仍旧……
let "f /= 0"
#   let: f /= 0: division by 0 (error token is "0")
# 预期之中。


# 在执行算术运算时,Bash 通常将其空值的整数值设为0。
# 但是不要做这种事情!
# 因为这可能会导致一些意外的后果。


# 结论:上面的结果都表明 Bash 中的变量是弱类型的。

exit #执行结束
exit $? # 也是执行结束只不过 $? 是最后一条命令退出状态,执行成功为 0 否则其他

最后更新于

这有帮助吗?