当我将包含多行变量的命令输出直接保存到终端中时,我得到以下结果:
$ 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 bar
和doo
.