입니다. 쉘 스크립트에 익숙하지 않으며 주어진 스크립트에서 다음 코드 행을 발견했습니다. 누군가가 코드의 다음 줄을 무엇 나를 설명 할 수이 bash 스크립트 코드 행의 의미는
어떤 도움
입니다. 쉘 스크립트에 익숙하지 않으며 주어진 스크립트에서 다음 코드 행을 발견했습니다. 누군가가 코드의 다음 줄을 무엇 나를 설명 할 수이 bash 스크립트 코드 행의 의미는
어떤 도움
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
사전에
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
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 프로그램도 아닙니다.
어쩌면 스크립트 자체에 정의되어있을 수 있습니다.
_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의 값을 대체하고 쉘 출력 창 될 일이 표준 출력 스트림에 그것을 제공합니다. 그게 전부입니다.
이 스크립트의 기능은 본질적으로 아무 것도 아닙니다.
_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}"
.
printk 또는 printf입니까? 그리고 ** 리눅스 쉘 스크립팅 ** – axiom
** windows ** 스크립팅? 정말? –
나에게 주어진이 스크립트는 윈도우에 쓰여졌 고 dos2unix를 사용하여 유닉스 스크립트로 번역되었다. 그래서 내 생각은 이것이 윈도우가 이해할 수있는 형식이라는 것입니다. – KItis