Bash - 在变量中保存$ @时是空间安全的

Fra*_*ank 7 bash

循环这样的变量时遇到问题.我准备了2个例子来说明问题.

EX1:

#!/bin/bash
DIRS="$@"

for DIR in $DIRS; do
    echo "$DIR"
done
Run Code Online (Sandbox Code Playgroud)

EX2:

#!/bin/bash
for DIR in "$@"; do
    echo "$DIR"
done
Run Code Online (Sandbox Code Playgroud)

第二个示例按预期(和必需)工作.快速测试如下:

$ ex1 "a b" "c"
a
b
c
$ ex2 "a b" "c"
a b
c
Run Code Online (Sandbox Code Playgroud)

原因,我为什么要使用第一种方法是因为我希望能够将多个目录传递给程序,或者不能使用当前目录.像这样:

[ $# -eq 0 ] && DIRS=`pwd` || DIRS="$@"
Run Code Online (Sandbox Code Playgroud)

那么,我如何让示例1保持空间安全?

Jon*_*ler 10

使用数组而不是简单变量.

declare -a DIRS

DIRS=("$@")

for d in "${DIRS[@]}"
do echo "$d"
done
Run Code Online (Sandbox Code Playgroud)

这会产生结果:

$ bash xx.sh a "b c" "d e f    g" h z
a
b c
d e f    g
h
z
$
Run Code Online (Sandbox Code Playgroud)