在linux中使用while循环逐个测试函数参数

时间:2017-05-16 07:21:46

标签: linux bash shell sh

我正在编写一个脚本,我应该使用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

我需要知道什么应该是while条件才能测试所有参数。

2 个答案:

答案 0 :(得分:1)

如果要使用切片表示法索引$@,请注意"${@:i}"从位置i开始采用所有位置参数。您需要"${@:i:1}"才能只使用一个。要遍历所有这些,请从$#获取计数,如下所示:

#!/bin/bash
i=1
while (( i <= $# )) ; do
    arg=${@:i:1}
    if [ "$arg" = that ] ; then
         ...
    fi
    let i++
done

请注意,几乎所有这些(let((...))== [ .. ]和切片表示法${var:n:m})都是POSIX shell语言的扩展所以hashbang应该指出一些其他的shell,比如Bash。

正如Inian在另一个答案中所表明的那样,通常的POSIX循环遍及所有 位置参数是

for arg in "$@" ; 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

答案 1 :(得分:0)

这个想法是正确的,只需使用适当的循环来遍历所有输入参数。使用它作为外部循环并在里面进行检查,

for arg in "$@"; 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

这应该与您的POSIX shell sh兼容。