首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在变量中保存$@时空间安全

在变量中保存$@时空间安全
EN

Stack Overflow用户
提问于 2011-05-01 22:27:04
回答 3查看 354关注 0票数 7

在循环使用这样一个变量时,我遇到了问题。我准备了两个例子来说明这个问题。

ex1:

代码语言:javascript
复制
#!/bin/bash
DIRS="$@"

for DIR in $DIRS; do
    echo "$DIR"
done

ex2:

代码语言:javascript
复制
#!/bin/bash
for DIR in "$@"; do
    echo "$DIR"
done

第二个示例按预期(和所需)工作。以下是一个快速测试:

代码语言:javascript
复制
$ ex1 "a b" "c"
a
b
c
$ ex2 "a b" "c"
a b
c

之所以要使用第一种方法,是因为我希望能够将多个目录传递给程序,或者不希望使用当前的dir。就像这样:

代码语言:javascript
复制
[ $# -eq 0 ] && DIRS=`pwd` || DIRS="$@"

那么,我如何使示例1成为空间安全的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-01 22:48:33

使用数组而不是简单的变量。

代码语言:javascript
复制
declare -a DIRS

DIRS=("$@")

for d in "${DIRS[@]}"
do echo "$d"
done

这产生了以下结果:

代码语言:javascript
复制
$ bash xx.sh a "b c" "d e f    g" h z
a
b c
d e f    g
h
z
$
票数 10
EN

Stack Overflow用户

发布于 2011-05-01 22:53:16

为什么不使用默认的扩展功能呢?

代码语言:javascript
复制
for DIR in "${@:-$(pwd)}"; do
    echo $DIR
done
票数 4
EN

Stack Overflow用户

发布于 2011-05-01 22:44:15

一种方法是用其他方法替换参数中的空格,然后在使用参数时再次替换空格:

代码语言:javascript
复制
dirs="${@/ /###}"
for dir in $dirs; do
    echo "${dir/###/ }"
done

这取决于您能够提出一些字符序列,您可以确信不会出现在一个真正的文件名。

对于特定情况(您希望能够在提供目录的显式列表还是默认到当前目录之间进行选择),更好的解决方案可能是使用一个函数:

代码语言:javascript
复制
do_something() {
    for dir in "$@"; do
        echo "$dir"
    done
}

if [ $# -eq 0 ]; then
    do_something .
else
    do_something "$@"
fi

或可能:

代码语言:javascript
复制
do_something() {
    echo "$1"
}

if [ $# -eq 0 ]; then
    do_something .
else
    for dir in "$@"; do
        do_something "$dir"
    done
fi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5851877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档