2012-05-02 3 views
0

입니다. 쉘 스크립트에 익숙하지 않으며 주어진 스크립트에서 다음 코드 행을 발견했습니다. 누군가가 코드의 다음 줄을 무엇 나를 설명 할 수이 bash 스크립트 코드 행의 의미는

어떤 도움

+0

printk 또는 printf입니까? 그리고 ** 리눅스 쉘 스크립팅 ** – axiom

+1

** windows ** 스크립팅? 정말? –

+0

나에게 주어진이 스크립트는 윈도우에 쓰여졌 고 dos2unix를 사용하여 유닉스 스크립트로 번역되었다. 그래서 내 생각은 이것이 윈도우가 이해할 수있는 형식이라는 것입니다. – KItis

답변

2
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }' 
사전에

  1. _filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

  2. printk "archiveWLS(): ${_filecount} file(s)"

감사를 의미

wc -w : wc는 단어 수이고, wordcount는 단어, 줄, 문자 등을 계산하며, -w는 단어 수만 출력합니다.

출력은 awk로 파이프되어 출력의 첫 번째 단어 만 인쇄합니다. 당신이

wc -w FILE 

를 사용하는 경우 파일 이름을 인쇄 할 것이다, 그것은 AWK와 함께 벗겨하는 의미가있다. 파일 이름이없는 파이프 출력으로 처리하는 것은 매우 어렵습니다. $ (...) 또는 역 따옴표없이

_filecount=$(echo ${_filelist} | wc -w) 

, 그것은 작동하지 않으며, filecount는 단어 "에코"를 할당됩니다

할당으로, 라인 대신해야한다. 저조한 스크립트처럼 보입니다.

printk는 bash에 정의되어 있지 않으며, coreutils의 잘 알려진 gnu 프로그램도 아닙니다.

어쩌면 스크립트 자체에 정의되어있을 수 있습니다.

1

_filelist 변수의 단어 수를 _filecount에 저장합니다. 정교화 :이 규칙 때문이다

_filecount=`echo ${_filelist} | wc -w | awk '{ print $1 }'`
당신은`에서의 그것을 포장해야합니다.

화장실에 _filelist에 저장된 무엇을 제공 에코.

화장실 (워드 카운터)가 (중간 결과의 통과가 배관라고 함)를 수신하고 그것이 -w 옵션으로 호출 있기 때문에, 이미 AWK에 단어의 수를 제공, 줄과 문자의 수를 스스로 유지합니다.

awk은 차례대로 첫 번째 열 (awk '{print $ 1}')을 인쇄합니다.

wc은 여기에 1 열만 공급합니다. 낱말 수, 그래서 awk를 실제로 부르는 것은 중복이다.

printf "archiveWLS(): ${_filecount} file(s)"

는 문자열로 _filecount의 값을 대체하고 쉘 출력 창 될 일이 표준 출력 스트림에 그것을 제공합니다. 그게 전부입니다.

0

이 스크립트의 기능은 본질적으로 아무 것도 아닙니다.

_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }' 

이 줄은 구문 상 유효하지만 정확하지 않을 수 있습니다. 그것은 만 다음 명령의 기간 동안 존재하는 임시 변수 할당으로 해석되고있다 않는 곳 echo가 나타납니다

때문에, 따라서, 환경 변수 _filecount은에 저장된 명령의 실행 중에 echo의 값을가집니다 변수 _filelist; 왜냐하면 _filelist에는 명령 이름이없고 대신 하나 이상의 비 실행 파일 이름이 포함되어 있기 때문에 command not found 오류가 발생합니다.

나머지 줄은 부적합합니다. ${_filelist} 명령이 표준 출력에 아무 것도 출력하지 않았으므로 아무 것도 wc -w으로 리디렉션되지 않았습니다. wc은 werre가 0 워드로 계산되고이 값은 awk으로 전달되며 이는 선행 공백을 제거합니다. 당신은 아마 echo 파이프 라인을 실행하고 _filecount 변수에 결과를 저장합니다 어느이었다 더

_filecount=$(echo ${_filelist} | wc -w | awk '{ print $1 }') 

같은 말을 무엇을 의미

.

이 정말 이런 공백으로 구분 된 문자열에서 파일 목록을 저장하는 것은 좋은 생각이 아니다 (한 가지 들어, 파일 이름에 공백이 있습니다), 대신에이처럼 bash 배열을 사용

_filelist=("file1.txt" "file2.txt") 
가 당신은 "${_filelist[@]}"와 파일의 목록에이를 확장 할 수 있습니다

는 모두가 제대로 인용, 당신은 지금 파일의 수를 이런 식으로 구할 수 있습니다

_filecount=${#_filelist[@]} 

훨씬 빠릅니다 (의 프로세스를 대신 실행 외부 유틸리티 호출) 및 더 안정적인 (do "한 파일은 한 단어입니다"의미에 의존하지 마십시오.) 이 라인에 관해서는

:

printk "archiveWLS(): ${_filecount} file(s)" 

printk라고 더 bash는 내장이없는 및 printk라는 표준 유틸리티는 결과가 될 가능성이 없기 때문에 :

-bash: printk: command not found 

당신은 할 수 이 경우 printf을 사용했습니다.

printf "archiveWLS(): ${_filecount} file(s)" 

그는 출력 0_filecount의 값이

archiveWLS(): 0 file(s) 

될 것이다.

하지만, 말을 더 좋은 것 :

또한 끝에 줄 바꿈을 포함하고 유지하기 쉬울를 출력 위와 같은,
printf 'archiveWLS(): %s file(s)\n' "${_filecount}" 

.

관련 문제