Answers:
wc
与其他命令一起使用:wc -l <<< "$LS"
printf '%s\n' "$LS"
当您想查看换行符时使用。键入错误,将其修复!
换行符在变量中。LS=$(ls -1)
将变量设置LS
为的输出ls -1
(ls
顺便说一下,其输出与相同,除非输出到终端),然后减去尾随的换行符。
问题在于,当您打印出该值时,您正在删除换行符。在shell脚本中,$LS
并不表示“变量的值LS
”,而是表示“取的值LS
,根据其将其拆分为单词IFS
并将每个单词解释为glob模式”。要获取的值LS
,您需要编写"$LS"
,或更一般地说,将其放在$LS
双引号之间。
echo "$LS"
打印的值LS
,在某些解释反斜杠字符的外壳程序中,以及以开头的一些值除外-
。
printf "$LS"
LS
只要不包含任何百分比或反斜杠字符并且(对于大多数实现)不以开头,就打印的值-
。
要打印LS
精确值,请使用printf %s "$LS"
。如果您想在末尾使用换行符,请使用printf '%s\n' "$LS"
。
请注意,$(ls)
通常不是当前目录中的文件列表。仅当您具有足够的驯服文件名时,这才起作用。要获取文件名列表(点文件除外),您需要使用通配符:*
。结果是一个字符串列表,而不是一个字符串,因此您不能将其分配给一个字符串变量。您可以files=(*)
在支持它们的shell中使用数组变量(ksh93,bash,zsh)。
有关更多信息,请参见为什么我的shell脚本在空白或其他特殊字符上感到窒息?
之前所提
printf '%s\n' "$LS"
是唯一正确的解决方案。
让我证明其他建议的解决方案(echo
和printf
都不能正常使用):
$ mkdir t
$ cd t
$ touch \\n
$ LS=$(ls -l)
$ echo "$LS"
total 0
-rw-r--r-- 1 domain domain 0 Nov 5 06:12
$ printf "$LS\n"
total 0
-rw-r--r-- 1 domain domain 0 Nov 5 06:12
$ printf '%s\n' "$LS"
total 0
-rw-r--r-- 1 domain domain 0 Nov 5 06:12 \n
$ ls -l
total 0
-rw-r--r-- 1 domain domain 0 Nov 5 06:12 \n
$ rm \\n
$ cd ..
$ rmdir t
$
(也可以使用V=$(printf 'line0:\\n\\n\nline1.\n') printf '%s\n' "$V"
和进行测试。)
而\n
在文件名中可能并不常见,将其存储git diff
到变量中,遇到字面\n
量的机会会大大增加。
ksh
并且zsh
也支持print -r -- "$LS"
和zsh
也具有echo -E - $LS
。csh
具有echo $LS:q
尽管这不输出换行符如果$ LS是空的,并得到一个多值转换成首位$ LS是在csh相当棘手。
printf "%s\n" $LS
可以这样做。