대체 변수 문자열을 패턴으로 사용하는 cksum 파일

대체 변수 문자열을 패턴으로 사용하는 cksum 파일

아래 예에서 이를 피할 수 있나요 eval? 아니면 다른 방법이 없나요? 변수의 파일 목록은 동적이며 모든 파일의 합계를 계산하고 싶습니다. 이 디렉터리에는 다른 많은 파일이 있지만 무시해야 합니다.

$ Z="file1 file4"
$ echo ${Z//\ /,}
file1,file4
$ echo {${Z//\ /,}}
{file1,file4}
$ cksum {file1,file4}
927007485 136284 file1
2748059092 136286 file4
$ cksum {${Z//\ /,}}
cksum: {file1,file4}: No such file or directory
$ eval cksum {${Z//\ /,}}
927007485 136284 file1
2748059092 136286 file4

답변1

문자열 대신 배열을 사용하십시오.

files=( file1 file2 "filename with spaces" file50 "*my* file" )

cksum "${files[@]}"

위의 각 큰따옴표는 특히 파일 이름에 공백이나 파일 이름 와일드카드 문자가 포함된 경우 중요합니다.

답변2

cksum {${Z//\ /,}}예상대로 작동하지 않는 이유를 설명하세요 .

  1. 배쉬에 따르면교체/확장 순서, 버팀대 확장이 발생합니다.앞으로매개변수 대체
  2. 하지만,문서화되어 있습니다"매개변수 확장과의 충돌을 피하기 위해 '${' 문자열은 중괄호 확장에 적합한 것으로 간주되지 않습니다. -- 따라서 bash는 여기서 중괄호 확장을 수행하지 않습니다."
  3. 그런 다음 쉘은 마지막으로 매개변수 대체를 수행하고 명령은 다음으로 확장됩니다.cksum {file1,file4}
  4. 쉘은 돌아가서 확장 목록을 다시 실행하지 않으므로 중괄호 확장을 다시 수행하지 않습니다. "{file1,file4}"라는 단어 하나만 남습니다.
  5. 그리고 그런 문서도 없습니다.

믹스인을 도입할 때 eval확장 목록을 다시 확인하도록 쉘에 명시적으로 요청합니다.지금명령에서 중괄호 확장을 수행 cksum {file1,file4}한 다음 두 파일의 체크섬을 얻을 수 있습니다.

관련 정보