对于命令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
答案 0 :(得分:3)
它只显示卡在一行上的每个文件,用空格分隔。
你必须考虑它是什么。
当你这样做时
text=`ls -1`
运行程序ls
并显示输出,就像输入它一样。所以shell会显示:
ls=file1
file2
file3
etc.
shell在空格上拆分命令行标记,默认情况下包括空格,制表符和换行符。因此,每个文件名都被shell视为一个单独的标记。
然后将这些标记作为单独的参数传递给echo
。 echo
命令不知道换行符在那里。
我相信你知道,所有echo
都是将每个参数写入stdout,每个参数之间都有一个空格。
这就是@ user5228826给出的建议有效的原因。如果您不想使用换行符来分隔令牌,请更改IFS
。
但是,您真正需要做的就是将变量括在引号中,以便它不会被拆分:
echo "$text"
顺便说一句,使用`backticks`是不推荐使用的,因为它很难阅读,特别是在嵌套时。如果您在脚本上运行ksh -n
,它会向您报告(假设您没有使用古老版本)。使用:
text=$(ls -1)
说了这么多,这是一个获取文件列表的可怕方法。 UNIX shell执行通配,这是对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
答案 1 :(得分:-1)
那是因为你将ls输出捕获到变量中。 Bash也是如此。