在循环使用这样一个变量时,我遇到了问题。我准备了两个例子来说明这个问题。
ex1:
#!/bin/bash
DIRS="$@"
for DIR in $DIRS; do
echo "$DIR"
doneex2:
#!/bin/bash
for DIR in "$@"; do
echo "$DIR"
done第二个示例按预期(和所需)工作。以下是一个快速测试:
$ ex1 "a b" "c"
a
b
c
$ ex2 "a b" "c"
a b
c之所以要使用第一种方法,是因为我希望能够将多个目录传递给程序,或者不希望使用当前的dir。就像这样:
[ $# -eq 0 ] && DIRS=`pwd` || DIRS="$@"那么,我如何使示例1成为空间安全的呢?
发布于 2011-05-01 22:48:33
使用数组而不是简单的变量。
declare -a DIRS
DIRS=("$@")
for d in "${DIRS[@]}"
do echo "$d"
done这产生了以下结果:
$ bash xx.sh a "b c" "d e f g" h z
a
b c
d e f g
h
z
$发布于 2011-05-01 22:53:16
为什么不使用默认的扩展功能呢?
for DIR in "${@:-$(pwd)}"; do
echo $DIR
done发布于 2011-05-01 22:44:15
一种方法是用其他方法替换参数中的空格,然后在使用参数时再次替换空格:
dirs="${@/ /###}"
for dir in $dirs; do
echo "${dir/###/ }"
done这取决于您能够提出一些字符序列,您可以确信不会出现在一个真正的文件名。
对于特定情况(您希望能够在提供目录的显式列表还是默认到当前目录之间进行选择),更好的解决方案可能是使用一个函数:
do_something() {
for dir in "$@"; do
echo "$dir"
done
}
if [ $# -eq 0 ]; then
do_something .
else
do_something "$@"
fi或可能:
do_something() {
echo "$1"
}
if [ $# -eq 0 ]; then
do_something .
else
for dir in "$@"; do
do_something "$dir"
done
fihttps://stackoverflow.com/questions/5851877
复制相似问题