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.
视为一个单独的标记
然后将这些标记作为单独的参数传递到 echo
。 echo
命令不知道换行符曾经在那里。
我相信你知道,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
对于命令 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.
视为一个单独的标记然后将这些标记作为单独的参数传递到 echo
。 echo
命令不知道换行符曾经在那里。
我相信你知道,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