运行完整的 foreach 命令

运行完整的 foreach 命令

我试图在仅 1 行代码内运行 foreach 循环,而不是像下面这样键入每个单独的命令;

Set n=0 ; foreach txt ( *_*.txt)
foreach? sed “s/_/-/g” $txt
foreach? @ n ++
foreach? End
echo You changed $n files

有没有什么方法可以在一行中运行所有这些命令,而不是像上面那样执行?

我正在使用 tcsh shell,但很难找到有关 foreach 如何在 shell 中工作的任何文档。

答案1

正如所指出的,在 csh/tcsh 中的一行上执行此操作的能力有些有限在本页:

不幸的是,csh 不允许使用“;”代替循环开始处的换行符,例如:

foreach fn ( * ) ; file $fn ; end<- 这不起作用

在这种情况下,就需要采取更为间接的方法。

alias check_ultras '(echo "foreach host ( tlsc0{1,2,3,4} ) " ; echo "echo :::: "\$"host :::: " ; echo "rsh "\$"host top -n -d1 7" ; echo "end" ) | csh'

  • 或者 -

echo "while ( 1 ) \n" "xset "{,-}"led 2; sleep 1 \n" end | csh -f

因此,就您的情况而言,您可以执行以下操作:

alias change_files '(echo "set n=0; foreach txt ( *_*.txt )"; echo "sed 's/_/-/g' "\$"txt"; echo "@ n ++"; echo "end"; echo "echo You changed "\$"n files) | csh'
change_files

(或者,避免创建单独的别名:)

'(echo "set n=0; foreach txt ( *_*.txt )"; echo "sed 's/_/-/g' "\$"txt"; echo "@ n ++"; echo "end"; echo "echo You changed "\$"n files) | csh'

但您可能可以通过另一种方式更轻松地做到这一点。您实际上想做什么——重命名文件,或更改这些文件的内容?

答案2

尝试这个:

echo 'set n = 0 \n foreach txt (_.n) \n sed "s/_/-/g" $txt \n @ n ++ \n end \n echo "您更改了 $n 个文件"' | csh-f

相关内容