2013-10-12 10 views
2

존재하고 내가 변수 MINIENTREGA_FICHEROS="informe.txt programa.c"내용이 내가 스크립트를 쓰고 있어요

이 변수는 공백으로 구분 된 파일의 수를 포함 할 수있는 경우 문자열을 구문 분석하고 확인하는 컷을 사용하여. 지금해야 할 일은 현재 폴더를 검사하여 파일이 있는지 확인하고 사용자에게 알려주는 것입니다. 이 상황에 맞을 것으로 생각했던 것은 cut을 사용하여 모든 단어를 서로 분리하고 각 단어를 지역 변수에 할당하는 것이 었습니다. 그 후에 if [ -e $var ]을 for의 내부에 사용하고 그 결과를 출력하거나 그 라인을 따라 무엇인가를 echo합니다.

어떤 조언이 필요합니까?

+0

배열을 사용하여 단일 문자열 매개 변수가 아닌 파일 이름을 저장합니다. – chepner

답변

3

cut은 필수 입력란이 이미 알려져있을 때, 즉 텍스트에서 열/열을 선택할 때 가장 잘 사용됩니다. 나는 간단한 do 루프가 훨씬 더 여기에 적합하다 생각 :

MINIENTREGA_FICHEROS="informe.txt programa.c" 
for i in $MINIENTREGA_FICHEROS; do 
    [ ! -e $i ] && echo 'file "'$i'" is missing' 
done 

출력 :

file "informe.txt" is missing 
file "programa.c" is missing 

편집 : 정확하려면 첫 번째 명령은 실제로 쉘에서 변수를 초기화하기 위해 여기에 포함된다 당신이 명령을 시험해 보면. 스크립트 내에 이미 사용중인 경우 (예 : 스크립트 내에서 사용하는 경우)이를 생략해야합니다.

+0

여기서'export'는 필요하거나 유용하지 않습니다. 그 목적은 서브 프로세스에서 변수를 볼 수있게하는 것이지만이 변수를 사용하는 프로세스를 시작하지 않습니다. – tripleee

+0

예, 알고 있습니다 ... 당신이 복사하여 붙여 넣기 할 수있는 것을 아직 터미널에 게시하고 싶었습니다. –

+0

그리고 '수출'을 생략하면 어떻게 될 수 있습니까? – tripleee

3

이름에 공백이없는 파일은 필요 없지만 작동합니다. @chepner가 주석에서 지적한 것처럼 $MINIENTREGA_FICHEROS을 간단한 문자열이 아닌 배열로 만들면이 문제를 피할 수 있으며 물론 변수를 구성하는 방식이 바뀌게됩니다.

또한 작동 훨씬 단순한 방법 :

ls $MINIENTREGA_FICHEROS > /dev/null || exit 1 

# If you change the variable to an array, this becomes: 
ls "${MINIENTREGA_FICHEROS[@]}" > /dev/null || exit 1 

참고 : 나는 의도적으로이 첫 번째 줄에 변수 확장 주위에 따옴표를 남겨 .

이 경우 파일이 존재하지 않으면 은 인수로 제공된 각 파일 이름에 대해 stderr에 오류 메시지를 생성합니다. Redirectly stdout ~ /dev/null은 파일 이름의 에코를 제거하여 혼란을 일으킬 수 있습니다. || exit은 파일이 없으면 스크립트를 종료합니다. 그것은 당신이 원하는 것일 수도 아닐 수도 있습니다. 네가 원하는 바가 아니라면 버려.

+0

질문에'bash '라는 태그가 붙어 있기 때문에 배열을 사용하여 파일 이름을 저장 한 다음'ls "$ {MINIENTREGA_FICHEROS [@]}">/dev/null'을 사용할 수도 있습니다. 그러면 모든 유효한 파일 이름에 대해 작동합니다. – chepner

+0

@chepner : +1. 원래 그 생각은 했었지만, 내가 만들려고했던 ("bash는 접착제로 사용하는 것이 가장 좋습니다") 간단한 점을 혼란스럽게 보였다. 그러나 유용한 점이기도하므로 추가했습니다. – rici

+0

충분합니다. OP의 다른 질문 중 하나는 배열을 전체 스크립트로 작업하는 것이 까다로울 수 있음을 암시합니다 (그는 현재 MINIENTREGA를 수출하고 있습니다). – chepner

관련 문제