bash
이 코드는 쉘용 이라는 것을 알고 있습니다.
for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done
이 코드는 tcsh
쉘용 입니다.
foreach f ( file.docked.[0-9][0-9][0-9] )
mv $f $f.pdb
end
참고자료를 읽어보니 이렇게 이해가 되었습니다. 학습자로서 두 코드를 모두 bash
. 작성된 Linux 셸 유형에 관계없이 확장을 통해 코드가 모든 셸에서 실행되도록 하는 방법이 있습니까?
답변1
for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done
csh
은 및 Bourne 제품군의 모든 셸(ash, bash, zsh, ksh, zsh, mksh, yash...) tcsh
에서 구문적으로 유효한 코드이지만 zsh
유용한 작업을 수행할 가능성이 가장 높습니다.
이 코드의 목적이 현재 디렉토리의 파일 이름에 쉘 변수의 내용으로 시작하고 3개의 ASCII 10진수로 끝나는 접미사를 추가하는 것이라면 .pdb
에서 다음이 필요합니다.$file
.docked.
bash
shopt -s failglob
for f in "$file".docked.[0123456789][0123456789][0123456789]
do
mv -- "$f" "$f.pdb"
done
( --
쉘에 관계없이 필요)bash
- Korn 셸에서와 마찬가지로 매개변수 확장을 인용해야 합니다. 그렇지 않으면 분할+glob을 거치게 됩니다.
[0-9]
일반적으로 0123456789보다 더 많은 문자와 일치하며 그 목록은 로케일 및 시스템에 따라 다릅니다. 0123456789만[0123456789]
일치 하면 됩니다bash
(아니요,최신 버전 옵션이globasciiranges
도움이 되지 않습니다).- 일치하지 않으면 glob이 확장되지 않으므로 일치하는 파일이 없으면 루프에
$f
포함을 통해 전달 됩니다. (csh 또는 zsh와 유사한 동작을 얻기 위해) 또는 (복사된 옵션에서) 문제를 해결합니다.contents-of-file-variable.docked.[0-9][0-9][0-9]
failglob
nullglob
zsh
foreach f ( file.docked.[0-9][0-9][0-9] )
mv $f $f.pdb
end
구문 처럼 보이지만 다시 구문 csh
입니다 zsh
. 해야 (t)csh
한다:
foreach f ( file.docked.[0-9][0-9][0-9] )
mv -- $f:q $f:q.pdb
end
(이 특별한 경우에는 :q
다른 예와 달리 s가 반드시 필요한 것은 아니지만 파일 이름에 SPC, TAB, LF 또는 와일드카드 문자가 포함되지 않음이 보장됩니다.)
완전히 다른 언어로 동일한 작업을 수행하는 유효한 코드를 작성하는 것은 매우 까다롭습니다. 일반적으로다국어코딩. 이것Code Golf stackex 자매 사이트에는 전용 섹션이 있습니다.. 하지만 이것은 일반적으로 하고 싶은 일이 아닙니다.
바라보다이 웹 사이트의 예이를 달성하는 데 필요한 길이의 예입니다.