在变量中使用bash参数然后循环遍历

时间:2014-09-03 15:04:30

标签: macos bash

我希望DIR循环遍历所有参数(使用空格和"")。但是这段代码无法识别," cd ef"作为一个。将它们分成两部分。 我怎样才能做到这一点?

#test.sh
echo Number of arguments: $#

if [ $# -eq 0 ]
then
  echo "No arguments"
  DIR=.
else 
  DIR="$*"
fi

echo DIR =$DIR
for arg in $DIR;
do 
  echo $arg;
done

命令

#bash test.sh ab "cd ef" 

输出,参数数量:2

但是,将循环中的3个元素枚举为ab, cdef

我知道,我能做到,

for arg in "$*";

但这不是这种情况下的解决方案。我可以将DIR用于此目的吗? 该平台是OSX Mavericks shell。

2 个答案:

答案 0 :(得分:4)

出于此目的,您需要使用数组而不是常规标量变量 - 而"$@",而不是$*

if (( $# )); then
  dirs=( "$@" )
else
  dirs=( . )
fi

for dir in "${dirs[@]}"; do
  ...
done

另见BashFAQ #5

答案 1 :(得分:1)

如果您实际上不需要变量DIR,则可以使用参数扩展形式:

echo "DIR=${@:-.}"
for dir in "${@:-.}"; do
   ...
done