아래와 같이 개별 명령을 각각 입력하는 대신 단 한 줄의 코드로 foreach 루프를 실행하려고 합니다.
Set n=0 ; foreach txt ( *_*.txt)
foreach? sed “s/_/-/g” $txt
foreach? @ n ++
foreach? End
echo You changed $n files
위와 같이 실행하는 대신 이 모든 명령을 한 줄로 실행할 수 있는 방법이 있습니까?
tcsh 셸을 사용하고 있는데 foreach가 셸에서 작동하는 방식에 대한 문서를 찾는 데 문제가 있습니다.
답변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 파일을 변경했습니다."' |