shell 命令行参数

时间:2019-04-16 23:59:04  来源:igfitidea点击:

大多数Linux命令可以根据提供给它的参数来执行不同的操作。

什么是命令行参数

命令行参数是发送给被调用的程序的参数。
一个程序可以接受任意数量的命令行参数。

例如:

[root@rhel6 ~]# ls hello
ls: cannot access hello: No such file or directory
  1. ls 是要执行的命令的名称。
  2. 命令后面的所有其他内容都将被当做该命令的参数。

再看下面的例子

[root@rhel6 ~]# tail +10 /var/log/messages
  • tail是命名的名称
  • +10 /var/log/messages是命令行参数

示例

下表举例说明了命令行参数

命令命令名称参数个数参数
lsls0N/A
ls /etc/resolv.confls1/etc/resolv.conf
cp /etc/resolv.conf /tmp/test.txtcp2/etc/resolv.conf, and /tmp/test.txt
sort -r -n /path/to/filesort3-r, -n, and /path/to/file
date +"%d-%m-%Y"date1+"%d-%m-%Y"

如何使用位置参数

所有命令行参数都可以通过特殊的shell变量$1、$2、$3、…、$9来获得。
其中的序号通过参数的位置排序获得,所以也叫做 位置参数

Shell设置的参数

Bash shell设置了几个特殊的参数。

  1. 所有命令行中的参数都可以通过$1、$2、$3、…,$9访问。
  2. $*保存了所有命令行参数。
  3. $#保存了位置参数的数量。
  4. $-保存了提供给shell的标志。
  5. $?保存了前面执行的命令的返回值。
  6. $$保存了shell(当前shell)的进程号。
  7. **$!**保存了上一个后台命令的进程号。
  8. $@保存了所有命令行参数。

我们可以将这些系统参数赋值给shell变量
例如

status=$?
[ $status -eq 0 ] && echo "Lighttpd ... [Ok]" || echo "Lighttpd ... [Failed]"

但是不能给他们赋值

# 可以
status=$?
# 反过来不允许
$?=-1

如何读取命令行参数

让我们看个例子

#!/bin/bash
echo "脚本名称 : 
chmod +x test.sh
./test.sh java php python
" echo "第一个参数 : " echo "第二个参数 : " echo "第三个参数 : " echo "传给脚本的参数数量 : $#" echo "所有命令行参数 (通过 $* 获取) : $*" echo "所有命令行参数 (通过 $@ 获取) : $@"

运行这个脚本

[root@rhel6 tmp]# ./test.sh java php python
脚本名称 : ./test.sh
第一个参数 : java
第二个参数 : php
第三个参数 : python
传给脚本的参数数量 : 3
所有命令行参数 (通过 $* 获取) : java php python
所有命令行参数 (通过 $@ 获取) : java php python

结果为:

#!/bin/bash
IFS='-'
echo "所有命令行参数 (通过 $@ 获取) : $@"
echo "所有命令行参数 (通过 $* 获取) : $*"

shell脚本中 $* 和 $@ 有什么区别?

从上面的例子中,我们看到的结果是一样的,似乎没有什么不同。其实
$@ 展开为 "$1" "$2" "$3" ... "$n"
$* 展开为 "$1{$IFS}$2{$IFS}$3{$IFS}...$n",

例如

[root@rhel6 tmp]# ./test.sh java php python
所有命令行参数 (通过 $@ 获取) : java php python
所有命令行参数 (通过 $* 获取) : java-php-python

结果为:

##代码##