shell 命令行参数
时间:2019-04-16 23:59:04 来源:igfitidea点击:
大多数Linux命令可以根据提供给它的参数来执行不同的操作。
什么是命令行参数
命令行参数是发送给被调用的程序的参数。
一个程序可以接受任意数量的命令行参数。
例如:
[root@rhel6 ~]# ls hello ls: cannot access hello: No such file or directory
- ls 是要执行的命令的名称。
- 命令后面的所有其他内容都将被当做该命令的参数。
再看下面的例子
[root@rhel6 ~]# tail +10 /var/log/messages
- tail是命名的名称
- +10 /var/log/messages是命令行参数
示例
下表举例说明了命令行参数
命令 | 命令名称 | 参数个数 | 参数 |
---|---|---|---|
ls | ls | 0 | N/A |
ls /etc/resolv.conf | ls | 1 | /etc/resolv.conf |
cp /etc/resolv.conf /tmp/test.txt | cp | 2 | /etc/resolv.conf, and /tmp/test.txt |
sort -r -n /path/to/file | sort | 3 | -r, -n, and /path/to/file |
date +"%d-%m-%Y" | date | 1 | +"%d-%m-%Y" |
如何使用位置参数
所有命令行参数都可以通过特殊的shell变量$1、$2、$3、…、$9来获得。
其中的序号通过参数的位置排序获得,所以也叫做 位置参数
Shell设置的参数
Bash shell设置了几个特殊的参数。
- 所有命令行中的参数都可以通过$1、$2、$3、…,$9访问。
- $*保存了所有命令行参数。
- $#保存了位置参数的数量。
- $-保存了提供给shell的标志。
- $?保存了前面执行的命令的返回值。
- $$保存了shell(当前shell)的进程号。
- **$!**保存了上一个后台命令的进程号。
- $@保存了所有命令行参数。
我们可以将这些系统参数赋值给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
结果为:
##代码##