Skip to content

Shell 变量

定义

自定义变量

自定义变量的定义不使用关键字

变量名使用小写蛇形命名 ( snake_case )

变量值默认都是字符串类型,若含有空格则需要使用引号包裹

bash
$ 普通变量1=值
$ 普通变量1=新值

$ readonly 只读变量=值
sh
#!/bin/bash

普通变量1=值
普通变量1=新值

readonly 只读变量=值
例子:验证自定义变量的创建与更新
bash
$ a=10
$ echo $a
$ a="hello world"
$ echo $a
10
hello world
sh
#!/bin/bash

a=10
echo $a
a="hello world"
echo $a

环境变量

自定义环境变量的定义使用关键字export

变量名使用大写蛇形命名 ( snake_case )

变量值默认都是字符串类型,若含有空格则需要使用引号包裹

bash
$ export 环境变量1=值
$ export 环境变量2=值
sh
#!/bin/bash

export 环境变量1=值
export 环境变量2=值
例子:将脚本文件中的自定义环境变量导出时需要通过source执行文件
bash
$ echo '
#!/bin/bash

$ export 环境变量1=值
$ export 环境变量2=值
' > 脚本文件.sh

$ bash 脚本文件.sh
$ source 脚本文件.sh

使用

$变量

bash
#!/bin/bash

变量1=值
变量2=$变量1

echo $变量1 $变量2

$( )

$( )可用于将一个命令的返回值作为一个变量的值

sh
#!/bin/bash

变量=$(命令)
例子:
bash
$ files=$(ls)
$ echo $files
afs bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

(( ))

(( ))可用于执行算术运算、比较运算

其中的变量不需要通过$引用

sh
#!/bin/bash

(( 算数运算 ))
(( 比较运算 ))
例子:
bash
$ a=10
$ (( a++ ))
$ echo $a
11
sh
#!/bin/bash

a=10
(( a++ ))
echo $a

$(( ))

$(( ))可用于执行算术运算的返回值作为一个变量的值

其中的变量不需要通过$引用,作用等同于expr 算数运算

sh
#!/bin/bash

变量1=$(( 算数运算 ))

变量2=`expr 算数运算`
例子:
bash
$ a=10
$ b=$(( a * 10 ))
$ echo $b
110
$ b=`expr $b / 10`
$ echo $b
11
sh
#!/bin/bash

a=10

b=$(( a * 10 ))
echo $b

b=`expr $b / 10`
echo $b

[ ]

[ ]可用于作为条件


[[ ]]

[[ ]]可用于作为条件

特殊变量

$n

变量$n可用于获取脚本接收的第n个参数的值

bash
$ echo $序号      # 当前脚本文件接收的指定序号位置的参数的值
$ echo $0        # 当前执行的进程名
例子:验证特殊变量$1$2的值
bash
$ echo '
#!/bin/bash

echo $1 $2
' > xxxx.sh

$ bash xxxx.sh 100 200
100 200
sh
#!/bin/bash

echo $1 $2
例子:验证特殊变量$0的值
bash
$ echo '
#!/bin/bash

echo $0
' > xxxx.sh

$ bash xxxx.sh
xxxx.sh

$ echo $0
/bin/sh

$#

变量$#可用于获取脚本接收的所有的参数的个数

bash
$ echo $#
例子:利用for循环与特殊变量$#打印接收的所有参数
bash
$ echo '
#!/bin/bash

echo $#

for ((i=1; i<=$#; i++)); do
  echo "$i: ${!i}"
done
' > xxxx.sh

$ bash xxxx.sh 100 200 300
1: 100
2: 200
3: 300
sh
#!/bin/bash

echo $#

for ((i=1; i<=$#; i++)); do
  echo "$i: ${!i}"
done

$@

变量$@可用于将脚本接收所有的参数转为一个字符串列表,可用于循环遍历

bash
$ echo $@
例子:利用for循环与特殊变量$@打印接收的所有参数
bash
$ echo '
#!/bin/bash

echo $@

for arg in "$@"; do
  echo "${arg}"
done
' > xxxx.sh

$ bash xxxx.sh 100 200 300
100 200 300
100
200
300
sh
#!/bin/bash

echo $@

for arg in "$@"; do
  echo "${arg}"
done

$*

变量$*可用于将脚本接收所有的参数转为一个字符串,并以空格间隔各个参数

bash
$ echo $*
例子:利用for循环验证特殊变量$@的值无法用于遍历
bash
$ echo '
#!/bin/bash

echo $*

for arg in "$*"; do
  echo "${arg}"
done
' > xxxx.sh

$ bash xxxx.sh 100 200 300
100 200 300
100 200 300
sh
#!/bin/bash

echo $*

for arg in "$*"; do
  echo "${arg}"
done

$?

变量$*可用于获取最近一次命令的执行状态

返回值为0时表明最近一次命令成功执行

bash
$ echo $?