我想列出一个接一个的目录中的所有文件,我正在使用示例shell脚本,如下所示
#!/bin/sh
MY_VAR="$(ls -1)"
echo "$MY_VAR"
这按预期工作,但是如果使用csh执行相同操作,则如下:
#!/bin/csh
set MY_VAR = `ls -1`
echo $MY_VAR
它输出一行中的所有文件,而不是每行打印一个文件。
任何人都可以解释为什么在csh ls -1中没有按预期工作。
答案 0 :(得分:1)
来自man csh
,强调我的:
命令替换
命令替换由``'括起来的命令指示。的的 这样一个命令的输出在空白处分成单独的单词, 制表符和换行符,并删除空字。输出是变量 能够和命令替换并代替原始字符串。
命令替换在双引号内(`“')保留空格和 标签;只有新行强制新词。单个最终换行没有 在任何情况下强制换一个新词。因此可以使用命令子 即使命令输出a,也只能产生一个单词的一部分 完整的一行。
默认情况下,自版本6.12以来的shell替换所有换行符和car- riage按空格返回命令中的字符。如果这是切换 通过取消设置csubstnonl,newlines像往常一样单独命令。
条目在列表中分配;您可以访问单个条目,例如echo $MY_VAR[2]
。
这与Bourne shell不同,Bourne shell没有“list”的概念,变量总是字符串。
要在一行上打印所有条目,请使用foreach
循环:
#!/bin/csh
set my_var = "`ls -1`"
foreach e ($my_var)
echo "$e"
end
建议在`ls -1`
周围添加双引号,因为这样可以确保当文件名带有空格时它可以正常工作(否则这些文件将显示为两个单词/列表条目)。