2016-07-26 2 views
0

물고기 셸 목록을 반복하고 해당 값을 저장하는 요소의 값을 해당 목록으로 변경하려고합니다.Fish Shell 스크립트가있는 루프 목록의 값 변경

원래의 목록은 다음과 같이 채워집니다

emacsclient.dockitem firefox.dockitem monodevelop.dockitem Thunar.dockitem 

지금 나는 그것을 반복하고 문자열 "dockitem"를 변경하려면 :

이 작동하고
set -l dockApplications (ls $HOME/.config/plank/dock1/launchers/) 

이 같은 목록을 생성 "데스크톱".

나는 루프를 시도하지만 올바르게 사용하는 것으로 표시되지 않습니다 :

for application in $dockApplications 
    echo $application 
    set application (string replace 'dockitem' 'desktop' $application) 
    echo $application 
    echo "===========" 
end 

이것은 이전과 문자열 수술 후 메아리와 나는 올바른 문자열을 생산하고 있습니다. 하지만 for 루프 뒤에 echo $dockApplications 같은 것을 할 때. "dockitem"확장자를 가진 문자열 목록을 얻습니다.

은 또한 설정을 시도 한 $dockApplications 변수 다르게 좋아 :

set -l dockApplications (string replace 'dockitem' 'desktop' (ls $HOME/.config/plank/$dockdir/launchers/)) 

그러나이 "dockitem"확장자를 가진 문자열의 같은 목록을 반환하는 것입니다.

변수가 할당되는 방식이나 범위가 여기에서 처리되는 방식을 근본적으로 오해한다고 생각합니다.

필자는 쉘 스크립팅에 대해 완전히 머리를 감쌌다. 나는 그것을 읽을 수 있고 무슨 일이 일어나고 있는지를 알 수있다. 그러나 그것을 구현하는 것에 관해서는 내가 다른 언어로하는 방식으로 뭔가를 성취하려고 할 때 몇 도로 블록을 쳤다. 그러나 나는 쉘 스크립팅의 힘을 깨닫고 그것에 대해 더 잘하고 싶습니다. 그래서 물고기 껍데기 관용적 인 방법으로 이것을하는 방법에 대한 모든 조언은 크게 감사하겠습니다.

+0

쉘 언어에서 능숙 해지는 데 도움이되는 것이 내 팔꿈치에서 수동으로 수행하는 것입니다. 에스. –

+0

'application' var은 원래 값을 참조하지 않고 값의 복사본을 가져옵니다. 원본 값의 사본을 수정하고 있습니다. Glenn이 제공 한 솔루션 외에도 원래 배열을 수정하지 않는 것이 좋습니다. 원래 배열을 반복하면서 새로운 배열을 만듭니다. –

답변

4

나는 지수는 장소에 업데이트 할 수 있도록 목록의 반복 것 :이 또한 루프없이 작동

set apps (printf "%s\n" ./launchers/*.dockitem) 
for i in (seq (count $apps)) 
    set apps[$i] (string replace "dockitem" "desktop" $apps[$i]) 
end 
printf "%s\n" $apps 

가 :

set apps (string replace dockitem desktop (printf "%s\n" ./launchers/*.dockitem)) 
printf "%s\n" $apps 

내가 기억하는 경우는, 물고기가 분할 배열에 저장할 때 줄 바꿈에 대한 명령 대체 출력

+0

고맙습니다. 나는 또한 나의 해결책 중 하나가 작동한다는 것을 깨달았지만 나는 'dock'철자가 틀렸다. – Jesse

+1

'printf'가 필요 없으며, 파일 이름에 개행 문자가 포함되어 있으면 (대부분 이론적 인) 버그가 추가됩니다. ''앱 ./launchers/*. dockitem'을 직접 설정하십시오. – faho

+1

정말로 개행에 신경 쓰지 않는다면'set apps (문자열 대체 "dockitem" "desktop"- .launchers/*. dockitem)'을 직접 호출하고 루프를 완전히 건너 뛸 수 있습니다. – faho