shell 位置参数

在执行脚本运行时,可以向脚本传递参数。shell脚本使用一些特殊的变量来表示这些参数,脚本内获取参数的格式为:${n},n代表一个数字,0表示当前命令、1表示执行脚本的第一个参数,2表示执行脚本的第二个参数,依次类推…,如果N只是一个数字,可以简写为$0、$1、$2,否则就要写成${10}、${11}、${12}的形式

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
echo $0
echo $1
echo $2

root@pc:/home/demo# ./hello.sh param1 param2
./hello.sh
param1
param2

除了使用$n变量接收参数之外,还有一些特殊的变量,用来表示跟参数相关的信息:

  • $0:运行的脚本的名字
  • $#:传递到脚本的参数个数
  • $*:以一个字符串显示所有向脚本传递的参数
  • \$$:脚本运行的当前进程PID号
  • $!:后台运行的最后一个进程的ID号
  • $@:与$*相同,但是使用时加引号,并在引号中返回每个参数
  • $-:显示shell使用的当前选项,与set命令功能相同
  • $_:启动shell的绝对路径
  • $?:显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误
root@pc:/home/demo# cat hello.sh 
#!/bin/bash
echo $0
echo $1
echo $2
echo param num: $#
echo all params: $*
echo pid:$$


root@pc:/home/demo# ./hello.sh param1 param2
./hello.sh
param1
param2
param num: 2
all params: param1 param2
pid:2605

$@ 和 $*的区别:

  • 相同点:都是引用所有参数
  • 不同点:只有在双引号中体现出来,假设向脚本传递三个参数1、2、3,“*”会将所有的参数看成一个整体,等价于“1 2 3”,而“@”则区分各个参数,等价于“1” “2” “3”

编写一个测试脚本,观察脚本的运行结果,区分这两个位置参数的区别:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

for param in "$*"
do
    echo $param
done

for param in "$@"
do
    echo $param
done


root@pc:/home/demo# ./hello.sh 1 2 3
1 2 3
1
2
3
《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客