Macos bash变量中的参数,然后循环

Macos bash变量中的参数,然后循环,macos,bash,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"

我希望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、cd
ef

我知道,我能行

for arg in "$*";
但这不是本案的解决方案。我可以为此使用DIR吗? 该平台是OSX Mavericks shell。

为此,您需要使用数组,而不是常规标量变量,以及
“$@”
,而不是
$*

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

for dir in "${dirs[@]}"; do
  ...
done
另请参见。

为此,您需要使用数组,而不是常规标量变量,以及
“$@”
,而不是
$*

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

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

另请参见。

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

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

如果您实际上不需要变量
DIR
,可以使用一种形式的参数展开:

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

$*
几乎不适合使用——它将参数与
IFS
的第一个字符连接起来,这意味着如果任何参数恰好包含IFS的第一个字符,则无法区分分隔参数的字符和参数中的字符。此外,非导出,非内置变量应至少有一个小写变量,以避免与环境变量和内置变量发生潜在的命名空间冲突。BashFAQ#50(切向)相关,因为它解决了许多相同的误解,导致在不合适的地方使用标量变量。
$*
几乎不适合使用——它将参数与
IFS
的第一个字符连接起来,这意味着如果任何参数恰好包含IFS的第一个字符,无法区分分隔参数的字符和参数中的字符。此外,非导出、非内置变量应至少有一个小写变量,以避免与环境变量和内置变量发生潜在的命名空间冲突。BashFAQ#50(切向)相关,因为它解决了许多相同的误解,这些误解导致在不合适的地方使用标量变量。