Shell基础知识(三)
Shell中变量的作用域:
- 
在当前Shell会话中使用,全局变量。
 - 
在函数内部使用,局部变量。
 - 
可以在其他Shell会话中使用,环境变量。
 
局部变量:
默认情况下函数内的变量也是全局变量
#!/bin/bash
function func() {
a=99
}
func
echo $a
输出
>> 99
为了让全局变量变成局部变量
#!/bin/bash
function func() {
    local a=99
}
func
echo $a
输出为空,说明此时变量a是局部变量
环境变量:
在父Shell中定义的变量,在子Shell中可以调用。
Shell位置参数
1) 给脚本传递位置参数
在运行shell脚本的时候可以带入一些位置参数,在脚本中$n来接收参数的值。如下:
#!/bin/bash
echo "language: $1"
echo "username: $2"
运行:
>> bash filename.sh Chinese mocun
输出:
>> language: Chinese
>> username: mocun
2) 给函数传递位置参数
#!/bin/bash
function func() {
    echo "language: $1"
    echo "username: $2"
}
func c++ mocun
这时就不能在运行的时候通过命令传入了,直接在脚本中调用函数的同时给参数就行。
输出:
>> language: c++
>> username: mocun
如果参数过多,超过10个了,那么就需要用${n}来接收,帮助解释器明确参数的边界,如:${11}
特殊变量
| 
 变量 
 | 
 含义 
 | 
| 
 $0 
 | 
 当前脚本的文件名 
 | 
| 
 $# 
 | 
 传递给脚本或者函数的参数个数 
 | 
| 
 $* 
 | 
 传递给脚本或者函数的所有参数 
 | 
| 
 $@ 
 | 
 传递给脚本或者函数的所有参数。当被双引号包含时,与上述$*有所不同。 
 | 
| 
 $? 
 | 
 上个命令的退出状态 
 | 
| 
 $$ 
 | 
 当前Shell的进程ID。对于Shell脚本,就是这些脚本所在的进程ID。 
 | 
示例,文件名为test.sh:
#!/bin/bash
echo "Process ID: $$"
echo "File Name: $0"
echo "First Parameter: $1"
echo "Second Parameter: $2"
echo "All Parameters 1: $@"
echo "All Parameters 2: $*"
echo "Total: $#"
>> bash test.sh yinzm mocun
输出
Process ID: 39817
File Name: seventh.sh
First Parameter: yinzm
Second Parameter: mocun
All Parameters 1: yinzm mocun
All Parameters 2: yinzm mocun
Total: 2
$*与$@的区别
简单说,当两个参数没有被双引号包含时是一模一样的效果,都是接收若干个独立的参数。但是当被双引号包含时,$*会将得到的所有参数拼在一起,但是$@仍然是若干个独立的参数。
示例,文件名filename.sh:
#!/bin/bash
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done
运行:
>> bash filename.sh a b c
输出:
print each param from "$*"
a b c
print each param from "$@"
a
b
c
$?的作用
1.获取上一个命令的退出状态
2.获取函数的返回值
                    
                
                
            
        
浙公网安备 33010602011771号