定义

变量名由数字、字母、下划线组成;必须以字母或者下划线开头;不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)

  1. variable=value
  2. variable='value'
  3. variable="value"

规则

定义变量的基本格式为”变量名=变量值”,注意等号两边没有空格,在变量名称前面添加美元符号”$”,可以引用一个变量的值,使用echo命令可以查看变量。

# version=6.0
# echo $version
6.0

双引号

双引号主要界定字符串的作用,当内容中出现空格的时候,在双引号范围内,使用“$”符号可以应用其他变量.

#people="人民"
# echo "中国$people"
中国人民

反撇号(`)

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给·变量。反撇号包裹的的字符内容必须是可以执行的命令行。

$ ls -la `which ls`
-rwxr-xr-x  1 root  wheel  38704 11 30 15:39 /bin/ls

变量类型

全局变量

export指定的变量成为全局变量

环境变量

env查看当前工作环境下的环境变量,PATH变量用于设置可执行程序的默认搜索路径,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到会提示“command not found”,HOME 表示用户宿主的主目录

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/baxiang/.local/bin:/home/baxiang/bin
PWD=/home/baxiang
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/baxiang
LOGNAME=baxiang

参数变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
echo "脚本名称$0"
echo "总共 $#个参数,分别是$*"
echo "第一个参数是$1,第五个参数$5"

执行脚本

# sh test.sh one two three four five six
脚本名称test.sh
总共 6个参数,分别是one two three four five six
第一个参数是one,第五个参数five

当位置参数数字大于9时,需要用大括号将数字括起来。

$* 和 $@ 的区别

$ 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(“ “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。
但是当它们被双引号(“ “)包含时,”$
“ 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@” 会将各个参数分开,以”$1” “$2” … “$n” 的形式输出所有参数。

$?退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

$ date
Mon Jul 26 11:09:41 CST 2021
echo $?
0

一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误, 退出状态码就是一个正数值。

$ data
bash: data: command not found
echo $?
127

无效命令会返回一个退出状态码127。Linux错误退出状态码没有什么标准可循,但有一些可 用的参考

图片.png
1
2
3
4
5
8
10
14
9
6
7
12
11
13
码就是一个正数值。

eg

if [[ $? != 0 ]];then
  echo "error"
  exit 1;
fi

退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

只读变量

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

#!/usr/bin/env bash

c="test only"
readonly c
c="update content"

变量操作

使用一个定义过的变量,只要在变量名前面加美元符号$即可

#!/usr/bin/env bash

name="test_name"
name_single='我的名字:${name}'
name_double="我的名字:${name}"
echo $name_single
echo $name_double
#我的名字:${name}
#我的名字:test_name



获取赋值

加花括号是为了帮助解释器识别变量的边界,

# !/bin/bash
for skill in Shell Action Java; do
    echo "I'm good at ${skill}Script"
done

删除变量

使用 unset 命令可以删除变量

#!/usr/bin/env bash

c="test content"
unset c
echo $c

变量运算

只能进行简单的整数运算,基本格式如下,注意运算符和变量之间必须至少有一个空格,变量必须是整数,不能是字符串或者小数

expr 变量1 运算符 变量2
# x=1
# y=2
# expr $x + $y

整数运算还可以使用$(()),注意是双层括号

# sum=$((1+2))
#echo $sum
#echo $((1+2+3))

命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。有两种方法可以将命令输出赋给变量:
1把命令用反引号包围起来,
2把命令用$()包围起来。

variable=`command`
variable=$(command)
#!/usr/bin/env bash

path=`pwd`
echo $path
list=$(ls)
echo $list

注意是反引号,不是单引号,这个键位于 Esc 键下方。
下面的例子中,将命令执行结果保存在变量中:

# !/bin/bash
d=`date`
echo "Date is $d"

或者把命令用$()包围起来。

#! bin/bash
d=$(date +%y%m%d)
echo  "The date and time are: " $d

变量替换

形式 说明
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

输入输出


printf

格式化输出语句。 printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。

read

read提示用户输入信息,从而实现简单的交互过程,执行的时候从标注输入读入一行内容

$ read -p "请输入内容: " inputVal
请输入内容: test content
$ echo $inputVal
test content