(二)Shell变量

二、Shell变量

1. 系统变量

$HOME:获取用户家目录,/Users/sangxiaoqian

$PWD: 获取当前目录

$SHELL: 获取系统默认解析器

$USER: 获取当前用户名,sangxiaoqian

$PATH: 获取系统的环境变量,/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

2. 自定义变量

定义变量语法:

  1. 定义变量:变量=值

注意,shell对空格不宽容,定义语法中不能有多余空格,该有空格的地方必须有空格

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % A=1
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $A
1
  1. 撤销变量:unset 变量

  2. 声明静态变量(只读变量):readonly 变量

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % readonly B=3
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $B
3
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % unset B
-bash: unset: B: cannot unset: readonly variable

注意:静态变量不能用unset撤销

  1. 全局变量:export 变量

全局变量可供全局shell程序使用。

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % B=1
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % vim helloworld.sh
#!/bin/bash
echo "Helo,World!"
echo $B
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sh helloworld.sh
Hello,World!

发现没有打印全局变量,export将局部变量提升为全局变量,供其他Shell使用

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % export B
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sh helloworld.sh
Hello,World!
1

定义变量规则:

  1. 变量名可以有字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
  2. 等号两侧不能有空格
  3. 在bash中,变量默认类型都是字符串类型,复发直接进行数值运算
  4. 变量的值如果有空格,需要使用双引号或单引号括起来
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % A=1' '2
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $A
1 2

3. 特殊变量

1. $n

n为数字,$0代表该脚本名称,$1-$9代表第1个到第9个参数,10以上的参数需要用大括号包裹,如$10

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % touch param.sh
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % vim param.sh 
#!/bin/bash
echo "$0 $1 $2 $3"

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % bash param.sh 
param.sh   
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % bash param.sh lisi wangwu zhagnliu
param.sh lisi wangwu zhagnliu
2.$#

获取脚本输入参数的个数

#!/bin/bash
echo "$0"
echo "$#"

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sh param.sh 
param.sh   
0
3.$*, $@

$*: 代表命令行中的所有参数,将命令行的所有参数看成一个整体

$@: 代表命令行中的所有参数,不过把每个参数区分对待

"$*""$@"分别代表整体参数和单个参数

$*$@都代表整体参数,没有区别

#!/bin/bash

for i in "$*"
do
	echo "#*: $i"
done

for i in "$@"
do
	echo "#@: $i"
done
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sh param.sh var1 var2
#*: var1 var2
#@: var1 
#@: var2
4.$?

最后一次执行的命令的返回状态:

  • 0: 代表上一个命令正确执行
  • 非0:代表上一个命令执行不正确
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sudo ./param.sh 
sudo: ./param.sh: command not found
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $?
1

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % chmod u+x param.sh 
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ./param.sh 
./param.sh   
0
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $?
0
5.$val

使用$val取值

posted @ 2022-08-24 15:45  言思宁  阅读(55)  评论(0编辑  收藏  举报