读取参数
bash shell将在命令行中输入的所有参数赋值给一些特殊变量,这些变量称为位置参数。其中还包括shell程序的名称。位置参数如下表示$0为程序名称,$1为第一个参数,$2为第二个参数,以此类推,$9为第九个参数
先看一个简单的栗子
#!/bin/bash
var=1;
for (( i=1; i<= $1 ; i++ ))
do
var=$[ $var * $i]
done
echo the factorial of $1 is $var
每个参数都是通过空格(多个空格也行)分隔的,要想在参数中包含空格,就必须使用单引号或双引号,见下面栗子
#!/bin/bash
echo $1
./test1 Rich Blum
./test1 'Rich Blum'
如果脚本需要的命令行参数多余9个,那么可以继续在命令行中添加命令行参数,在第9个变量后,必须这样表示以后的参数,如第10个参数,${10},看一个栗子
#!/bin/bash
var=$[ ${10} * ${11} ]
echo $var
读取程序名称
先看一个栗子
#!/bin/bash
echo the script is : $0
然后这样执行
./test3 #会打印./test3
/home/david/test3 #会打印/home/david/test3
可以看出传递给变量$0的字符串实际上是程序的完整路径,而不仅仅是程序的名称,而basename只获取程序的名称,不带路径
#!/bin/bash
name=`basename $0`
echo the script is : $name
现在使用这个方法编写基于使用的脚本的名称来执行不同功能的脚本,如下
#!/bin/bash
name=`basename $0`
if [ $name = "addem" ]
then
total=$[ $1 + $2 ]
elif [ $name = "multem" ]
then
total=$[ $1 * $2 ]
fi
echo the value is $total
之后复制一份,并改名即可执行不同的功能了
测试参数
在shell脚本中使用命令行参数时要非常小心,如果执行脚本时缺少参数,会产生很糟的结果,好的方法是对参数进行检查来保证使用参数前确定存在数据
#!/bin/bash
#刚开始写这个脚本时忘了加双引号,试试会发生什么
if [ -n "$1" ]
then
echo hello $1,glad to meet you
else
echo "sorry,you didnt know you "
fi
特殊的参数变量
可以不必测试每个参数,而只对命令行中输入的参数个数进行计数。特殊变量$#中存储执行脚本时包含的命令行参数的个数
#!/bin/bash
echo there is $# parameters supplied
现在可以在使用参数前测试现有的参数个数
#!/bin/bash
name=`basename $0`
if [ $# -ne 2 ]
then
echo usage: $name less parameters
else
total=$[ $1 + $2 ]
echo total is $total
fi
${$#}似乎可以用来表示最后一个命令行参数,可以使用\${!#}来表示最后一个参数.
#!/bin/bash
params=$#
#echo the last parameter is ${$#}会出错
echo the total params is $params
echo the last parameter is ${!#}
还要注意若没有参数时,$#返回0,而${!#}返回脚本名称
获取所有数据
变量$*和$@这两个变量都是在一个变量中包含所有命令行参数
#!/bin/bash
echo "Using the \$* method is : $*"
echo "Using the \$@ method is : $@"
但是有区别,看下面栗子
#!/bin/bash
count=1
for para in "$*"
do
echo "\$* param #$count = $para"
count=$[ $count + 1 ]
done
count=1
for para in "$@"
do
echo "\$@ param #$count = $para"
count=$[ $count + 1 ]
done
只有把$*和$@被双引号包起来的时候才会有差异,可以知道变量$*将所有参数视作一个单词,而变量$@分别对待每个参数,上面的程序若不用双引号则是没有差异的
移位
bash shell通过shift命令来帮助操作命令行参数,shift命令能够改变命令行参数的相对位置,使用shift命令时,默认将每个参数变量左移一个位置。于是,变量$3的值移给变量$2,变量$2的值移给变量$1,而变量$1的值被丢弃(注意变量\$0的值和程序名称都不变)
#!/bin/bash
count=1
while [ -n "$1" ]
do
echo "#$count = $1"
count=$[ $count + 1]
shift
done
测试
./test12 ni hao hello
可以通过shfit命令提供一个参数来实行多位移变化,提供需要移动的位置数目即可
#!/bin/bash
echo "the origin paras is : $*"
shift
echo "here is the new first para: $1"
测试
./test16 1 2 3 4 5