2017-05-16 33 views
2

我正在编写一个脚本,我应该测试用户通过while循环给出的参数。最后一个参数应该始终是“本地”和没有固定数量的参数计数(我们可以,因为我们希望添加尽可能多的参数)在linux中使用while循环逐个测试函数参数

这里是到目前为止我的代码:

#!/bin/sh 

echo 
echo -n 'My OS is : ' 
unamestr=`uname` 
echo $unamestr 

i=1 
while [ "${@:i}" != "local" ] 
do 
    if [ "${@:i}" == "mysql" ] 
    then 
     #add the repository 
     wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 
     sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm 
     yum update 
     #Install mysql 
     sudo yum install mysql-server 
     sudo systemctl start mysqld 
    elif [ "${@:i}" == "chrome" ] 
    then 
     echo 'Installing Chrome' 
    else 
     echo 'Nothing' 
    fi 

    let i++ 
done 

我需要知道为了测试所有的参数应该是什么条件。

+0

我没有找到你的答案@Inian – RoyNasr

回答

0

这个想法是正确的,只是使用一个适当的循环来遍历所有的输入参数。以此为外环里面还你的支票,

for arg in "[email protected]"; do 

    # Proceed to next argument if the current is "local" 
    [ "$arg" = "local" ] && continue 

    if [ "$arg" = "mysql" ] 
    then 
     #add the repository 
     wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 
     sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm 
     yum update 
     #Install mysql 
     sudo yum install mysql-server 
     sudo systemctl start mysqld 
    elif [ "$arg" = "chrome" ] 
    then 
     echo 'Installing Chrome' 
    else 
     echo 'Nothing' 
    fi 
done 

这应该是你的POSIXsh兼容。

+1

This s橄榄我的问题!谢谢,并为延迟抱歉:D – RoyNasr

1

如果要使用切片符号索引[email protected],请注意,"${@:i}"将从位置i开始获取所有位置参数。你需要"${@:i:1}"才能拿到一个。要通过所有的人都跑,得到$#计数,所以是这样的:

需要注意的是,几乎所有这些(let((...))==[ .. ]和切片标志${var:n:m})是扩展到POSIX shell语言,所以hashbang应该可能指示其他一些shell,比如Bash。

由于Inian显示在对方的回答,通常的POSIX地遍历所有 位置参数是

for arg in "[email protected]" ; do... 

for arg do ... 

,如果你需要使用当前索引POSIXly,做像

i=1 
for arg do 
    if [ "$#" -eq "$i" ] ; then echo "the last one" ; fi 
    echo "$i: $arg" 
    i=$((i + 1)) 
done