이것은 주간 연습을 위한 것이며 채점이나 성적이 없습니다(답도 얻지 못했습니다!).
저는 이 작업을 주말에 끝내려고 노력 중이고 다음 주까지는 강사로부터 도움을 받을 수 없기 때문에 누구든지 저에게 이 운동을 설명할 시간이 있다면 정말 감사하겠습니다. 나는 bash 프로그래밍, regex 및 grep을 다루는 많은 독서와 작업을 해왔습니다. 그러나 아래 코드는 나를 당황하게 만들었습니다.
지침이 불완전한 것인지 아니면 제가 이해하지 못하는 것인지 궁금합니다.
특히 다음 사항으로 인해 전체 내용을 이해하지 못합니다.
NAMES=`ls *.$1`
filed=$(file:$1).$2
연습 4.3
다음 내용을 포함하는 텍스트 파일(myfile이라고 함)이 주어졌다고 가정합니다.
#!/bin/bash
NAMES=`ls *.$1`
for file in $NAMES; do
filed=$(file%:$1).$2
mv file filed
done
다음 명령을 실행하십시오. $ grep ' file ' myfile
$ grep 'file*' myfile
$ grep '^ *file*' myfile
$ grep 'file$' myfile
$ sed 's/ file* / script /g' myfile
$ sed ' /for/,/files/d' myfile
$ sed '/\$[A-Z]..[A-Z]*/d' myfile
그런 다음 출력 또는 결과를 설명하십시오.
답변1
NAMES=`ls *.$1`
이것은 과제입니다. 변수에 $NAMES
값이 할당됩니다. 값은 역따옴표 안의 명령 출력으로 사용됩니다( 의 명령 대체 참조 man bash
). $1
특수 매개변수이며 스크립트의 첫 번째 인수에 해당합니다. 따라서 스크립트는 확장명을 매개변수(예: ./script.sh txt
)로 실행해야 하며 명령의 출력은 ls
변수에 저장됩니다.
filed=$(file%:$1).$2
정말 이상해요. 실제로 괄호가 중괄호가 아니었나요? 그리고 . .
대신 가 있어야 합니다 :
.
filed=${file%.$1}.$2
${var%pattern}
변수의 끝에서 패턴을 잘라냅니다. 자세한 내용은 매개변수 확장을 참조하세요 man bash
. 따라서 이 경우에는 점과 첫 번째 매개변수에 지정된 확장자를 제거하고 점과 두 번째 매개변수를 추가합니다.
그런데, 이동 라인은 아마도
mv $file $filed
그렇지 않으면 루프를 사용할 이유가 없습니다.