我正在编写一个脚本,我应该使用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条件才能测试所有参数。
答案 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
兼容。