Ksh ls -1 没有按预期工作

Ksh ls -1 not working as expected

对于命令 ls,选项 -1 应该做 运行 ls 产生只有一列的输出(每行产生一个文件)。但是如果我把它放在一个脚本中,它只会显示每个文件都挤在一行上,用空格分隔。

脚本:

#!/bin/ksh

text=`ls -1`
echo $text

文件夹内容:

test
  |--bob
  |--coolDir
  |--file
  |--notThisDirectoryAgain
  |--script.sh
  |--spaces are cool
  |--thatFile

脚本输出:

bob coolDir file notThisDirectoryAgain script.sh spaces are cool thatFile

如果我 运行 ls -1 在终端中输出(而不是在脚本中)

bob
coolDir
file
notThisDirectoryAgain
script.sh
spaces are cool
thatFile

那是因为您将 ls 输出捕获到一个变量中。 Bash 也一样。

它只是显示每个文件都挤在一行上,用 spaces 分隔。

你得考虑是什么。

当你

text=`ls -1`

那个 运行 程序 ls 并显示输出,就像您输入它一样。因此 shell 显示为:

ls=file1
file2
file3
etc.

shell 在白色 space 上拆分命令行标记,默认情况下包括 space、制表符和换行符。因此每个文件名都被 shell.

视为一个单独的标记

然后将这些标记作为单独的参数传递到 echoecho 命令不知道换行符曾经在那里。

我相信你知道,echo 所做的就是将每个参数写入标准输出,每个参数之间有一个 space。

这就是@user5228826 给出的建议有效的原因。如果您不想用换行符分隔标记,请更改 IFS

但是,您真正需要做的就是将变量括在引号中,这样它就不会被拆分:

echo "$text"

顺便说一下,不赞成使用“反引号”,这是一种糟糕的做法,因为它可能难以阅读,尤其是在嵌套时。如果你在你的脚本上 运行 ksh -n 它会报告给你(假设你没有使用旧版本)。使用:

text=$(ls -1)

话虽如此,这是获取文件列表的糟糕方法。 UNIX shells 进行通配,这是对 ls 外部程序的不必要使用。尝试:

text=(*)             # Get all the files in current directory into an array
oldIFS="$IFS"        # Save the current value of IFS
IFS=$'\n'            # Set IFS to a newline
echo "${text[*]}"    # Join the elements of the array by newlines, and display
IFS="$oldIFS"        # Reset IFS to previous value