UNIX:如何使用格式打印变量的内容。

UNIX: How to print contents of variable with formatting.

我只想像在命令行中一样打印 ls -l(每个文件在一个新行上)。我到处寻找解决方案,并且知道我的解决方案 应该 有效,但由于某种原因它不起作用。我试过:

    #!/bin/csh
    set list = `ls -l`
    echo "$list"

和:

    #!/bin/csh
    set list = "`ls -l`"
    echo "$list"

运气不好。我真正想做的是稍后在 ls -l 上使用 grep(所以我可能会做错),但我不能,因为它将列表打印为一长行。 (是的,我必须使用 csh)

当您 echo 时,我不知道如何绕过 csh 将单词连接在一起的行为,但您可以使用类似数组的功能和循环。例如:

#!/bin/csh

set list=( "`printf 'a\nb\nc\n'`" )

echo "count=$#list"
echo "2 = $list[2]"
echo

set n=0
while ( $n < $#list )
    @ n += 1
    echo "$n : $list[$n]"
end

这对我来说产生了输出:

count=3
2 = b

1 : a
2 : b
3 : c

请注意,我在 FreeBSD 上使用 tcsh。你的csh可能不一样,你没有提到你的平台。

要将此问题带回您的文件列表问题,您可以使用类似的循环复制您正在寻找的输出:

#!/bin/csh

set list=( "`ls -l`" )
set n=0
while ( $n < $#list )
    @ n += 1
    echo "$list[$n]"
end

这里需要重点考虑的是,在(命令替换)反引号 (`...`) 中,输出由 空格 分隔,而在双引号 ("..."), 输出由 newlines.

字分隔

也就是说...

What I really want to do is use grep on ls -l later (so maby I'm going about this wrong), but I can't because it prints list as one long line.

完全有可能! :-) 但是,如果不完全了解您要解决的根本问题,帮助您实现您的 解决方案是我们所能做的最好的。当心可怕的 XY Problem.