变量
变量有全局变量和局部变量之分,也可以按照系统预定义和自定义变量之分, 其中子shell进程无法读取父进程的局部变量,全局变量可以被子进程读取。查看所有的全局变量:
sh
## 查看系统所有的全局变量
[root@hadoop100 shell_learn]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
......
1. 系统预定义变量
常用系统变量$HOME、$PWD、$SHELL、$USER等
sh
[root@hadoop100 shell_learn]# echo $USER
root
## 查看所有的变量, 包括全局的和局部的
[root@hadoop100 shell_learn]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
......
2. 局部变量
局部变量主要指的是在函数内部有效,函数外部不能访问。在Shell脚本中,使用local
关键字来定义局部变量,以避免与全局变量发生冲突。
sh
void myFunction() {
int localVar = 10; // 定义局部变量
printf("Local variable: %d\n", localVar);
}
3. 自定义变量
基本语法
- 定义变量:[declare] 变量名=变量值,注意,=号前后不能有空格
- 撤销变量:unset 变量名
- 声明静态变量:readonly 变量,注意:不能 unset静态变量
变量定义规则 - 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 等号两侧不能有空格
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
sh
[root@hadoop100 shell_learn]# my_var=hello
[root@hadoop100 shell_learn]# echo $my_var
hello
## 查看变量是否存在
[root@hadoop100 shell_learn]# env | grep my_var
[root@hadoop100 shell_learn]# set | grep my_var
my_var=hello
## 查看子Shell进程是否能看到$my_var变量
[root@hadoop100 shell_learn]# bash
[root@hadoop100 shell_learn]# echo $my_var
[root@hadoop100 shell_learn]# exit
exit
[root@hadoop100 shell_learn]# echo $my_var
hello
## 将局部变量升级为全局变量
[root@hadoop100 shell_learn]# export my_var
[root@hadoop100 shell_learn]# env | grep my_var
my_var=hello
## 如果子shell进程更改了全局变量,父Shell进程依旧读取的是老的全局变量
[root@hadoop100 shell_learn]# bash
[root@hadoop100 shell_learn]# echo $my_var
hello
[root@hadoop100 shell_learn]# my_var="hello linux"
[root@hadoop100 shell_learn]# export my_var
[root@hadoop100 shell_learn]# echo $my_var
hello linux
[root@hadoop100 shell_learn]# exit
exit
[root@hadoop100 shell_learn]# echo $my_var
hello
[root@hadoop100 shell_learn]# echo "echo $my_var" >> hello
4. 特殊变量
4.1 $n
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
sh
[root@hadoop100 shell_learn]# cat helloworld.sh
#!/bin/bash
echo "hello, $0"
echo "获取传入参数1:$1"
echo "参数2:$2"
[root@hadoop100 shell_learn]# ./helloworld.sh jack learn
hello, ./helloworld.sh
获取传入参数1:jack
参数2:learn
4.2 $#
基本语法$#
(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。
sh
[root@hadoop100 shell_learn]# cat helloworld.sh
#!/bin/bash
echo "hello, $0"
echo "获取传入参数1:$1"
echo "参数2:$2"
echo "一共接收到参数:$#个"
[root@hadoop100 shell_learn]# ./helloworld.sh jack learn
hello, ./helloworld.sh
获取传入参数1:jack
参数2:learn
一共接收到参数:2个
4.3 $*和$@
基本语法
$*
(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
sh
[root@hadoop100 shell_learn]# cat helloworld.sh
#!/bin/bash
echo "hello, $0"
echo "获取传入参数1:$1"
echo "参数2:$2"
echo "一共接收到参数:$#个"
echo "所有的参数: $*"
echo "所有的参数: $@"
[root@hadoop100 shell_learn]# ./helloworld.sh jack learn
hello, ./helloworld.sh
获取传入参数1:jack
参数2:learn
一共接收到参数:2个
所有的参数: jack learn
所有的参数: jack learn
#### 两者的区别
[root@hadoop100 shell_learn]# cat for_test2.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
echo '==================================='
for j in "$@"
do
echo $j
done
[root@hadoop100 shell_learn]# ./for_test2.sh apple mac iphone ipad
apple mac iphone ipad
===================================
apple
mac
iphone
ipad
提示
$*和$@都表示传递给函数或脚本的所有参数,不被双引号""包含时,都以$1 $2 …$n的形式输出所有参数。 当它们被双引号""包含时,$*会将所有的参数作为一个整体,以"$1 $2 …$n"的形式输出所有参数;$@会将各个参数分开,以"$1" "$2"…"$n"的形式输出所有参数。
4.4 $?
基本语法$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
sh
[root@hadoop100 shell_learn]# cat helloworld.sh
#!/bin/bash
echo "hello, $0"
echo "获取传入参数1:$1"
echo "参数2:$2"
echo "一共接收到参数:$#个"
echo "所有的参数: $*"
echo "所有的参数: $@"
[root@hadoop100 shell_learn]# echo $?
0