我试图在仅 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