当我将包含多行变量的命令输出直接保存到终端中时,我得到以下结果:
$ 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 循环中解析四个目录路径中的每一个。
此处的 glob 将目录名称扩展为单独的参数,就像您在命令行上手动写出它们一样:
但是,在脚本本身中,您仅引用第一个参数
$1
:如果要引用所有参数,请使用
"$@"
(带引号)。但是,您在这里对目录名称所做的
ls
只是在它们上运行,它只会打印出相同的名称(尽管在不同的行上)。因此,如果您只想将参数列表作为字符串,则根本不需要运行ls
命令,只需 assigndirs="$@"
。然而,在大多数情况下,如果不是所有情况,最好将文件名列表保留在位置参数中,然后使用
或者
请注意,文件名可能包含空格,当您将名称连接到单个字符串时,您将失去名称中空格的含义。
foo bar doo
可能是三个文件,或者两个文件foo bar
和doo
.