Posix shell 脚本 - 将多行命令输出保存到变量

Posix shell 脚本 - 将多行命令输出保存到变量

当我将包含多行变量的命令输出直接保存到终端中时,我得到以下结果:

$ dirs=$(ls -1d /mnt/*/)
$ echo $dirs
/mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/
$ echo "$dirs"
/mnt/ext4/
/mnt/local/
/mnt/remote/
/mnt/test/

然而,当从 posix shell 脚本使用它时,结果是不同的。这是脚本

#!/bin/sh

dirs=$(ls -1d $1)
echo "inline"
echo $dirs
echo "multiline"
echo "$dirs"

这是脚本输出

$ ./test.sh /mnt/*/
inline
/mnt/ext4/
multiline
/mnt/ext4/

即使我使用 bash 而不是 sh,也会发生这种情况。

有谁知道如何将输出保存ls -1d /mnt/*/到变量中以保持完整输出?
我想解析 for 循环内的四个目录路径中的每一个。

答案1

$ ./test.sh /mnt/*/

这里的 glob 扩展为目录名称作为单独的参数,就像您在命令行上手动写出它们一样:

$ ./test.sh /mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/

但是,在脚本本身中,您仅引用第一个参数$1

dirs=$(ls -1d $1)

如果要引用所有参数,请使用"$@"(带引号)。

然而,您在这里对目录名称所做的只是在它们上运行ls,这只是打印出相同的名称(尽管在不同的行上)。因此,如果您只想将参数列表作为字符串,则ls根本不需要运行命令,只需分配dirs="$@"

然而,在大多数情况下,如果不是全部情况下,最好将文件名列表保留在位置参数中,并使用循环遍历它们

for f in "$@"; do ...

或者

for f
do ...

请注意,文件名可能包含空格,当您将名称连接到单个字符串时,您会失去名称中空格的含义。foo bar doo可能是三个文件,或者两个文件foo bardoo.

相关内容