홈페이지 » 어떻게 » 쉘 스크립트 작성을위한 초보자 안내서 2 For Loops

    쉘 스크립트 작성을위한 초보자 안내서 2 For Loops

    괴짜 신디를 만들고 싶다면 셸 스크립팅 시리즈의 두 번째 기사에 참여하십시오. 몇 가지 수정 사항과 지난 주 스크립트에 대한 몇 가지 개선 사항, 초보자를위한 루핑 가이드가 있습니다..

    다시 방문한 datecp 스크립트

    쉘 스크립팅 가이드의 첫 번째 기사에서는 파일 이름 끝에 날짜를 추가 한 후 파일을 백업 디렉토리에 복사하는 스크립트를 만들었습니다.

    Samuel Dionne-Riel은 변수 참조를 처리하는 훨씬 더 좋은 방법이 있다고 의견에서 지적했습니다.

    인수는 bash 쉘에서 공백으로 구분되며 결과로 펼쳐진 명령에 공백이 있으면 토큰 화됩니다. 스크립트에서, cp $ 1 $ 2. $ date_formatted 확장 변수가 공백을 포함하지 않는 한 의도 한대로 작동합니다. 이 방법으로 스크립트를 호출하는 경우 : datecp "내 옛 이름" "내 새 이름" 확장하면 다음 명령이 실행됩니다. cp 내 새 이름은 내 옛 이름 .the_date 실제로 6 개의 논쟁이있다..

    이 문제를 해결하려면 스크립트의 마지막 줄을 다음과 같이 지정해야합니다. cp "$ 1" "$ 2. $ date_formatted"

    보시다시피 스크립트의 줄을 다음과 같이 변경하십시오.

    cp -iv $ 1 $ 2. $ date_formatted

    에:

    cp -iv "$ 1" "$ 2". $ date_formatted

    이름에 공백이있는 파일에서 스크립트를 사용할 때이 문제를 처리합니다. Samuel은 또한이 사이트 (또는 일반적으로 인터넷)의 코드를 복사하여 붙여 넣을 때 종종 대시로 대체하는 "활판 인쇄"보다 적절한 대시와 따옴표로 대체해야합니다. 우리는 또한 코드가 더 복사 / 붙여 넣기가 잘되는지 확인하기 위해 더 많은 작업을 수행 할 것입니다. ;-)

    또 다른 주석가 인 Myles Braithwaite는 파일 확장자 앞에 날짜가 오도록 스크립트를 확장하기로 결정했습니다. 그래서 대신

    맛있는 파일 .mp3.07_14_11-12.34.56

    우리는 이것을 얻을 것이다 :

    맛있는 파일 .07_14_11-12.34.56.mp3

    대부분의 사용자에게 조금 더 편리해졌습니다. 그의 코드는 GitHub 페이지에 있습니다. 그가 파일 이름을 분리하는 데 사용하는 방법을 살펴 보겠습니다..

    date_formatted = $ (날짜 + % Y- % m- % d_ % H. % M % S)
    file_extension = $ (echo "$ 1"| awk -F. 'print $ NF')
    file_name = $ (basename $ 1. $ file_extension)

    cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension

    서식을 약간 변경했는데, Myles가 Line 1에서 날짜 함수를 선언했음을 알 수 있습니다. 그러나 Line 2에서는 스크립트의 첫 번째 인수와 함께 "echo"명령을 사용하여 파일의 이름을 출력합니다. 그는 pipe 명령을 사용하여 출력을 가져 와서 다음 부분의 입력으로 사용합니다. 파이프가 끝난 후 Myles는 "awk"명령을 호출합니다.이 명령은 강력한 패턴 스캐닝 프로그램입니다. -F 플래그를 사용하여, 다음 문자 (공백 다음)가 "필드 분리 문자"를 정의하는 것임을 명령에 알립니다. 이 경우, 그것은 기간입니다..

    이제, awk는 "tastyfile.mp3"이라는 파일을 "tastyfile"과 "mp3"의 두 필드로 구성합니다. 마지막으로 그는

    'print $ NF'

    마지막 필드를 표시합니다. 파일에 여러 마침표가있는 경우 awk가 여러 필드를 볼 수있게 만드는 경우에는 파일 확장명 인 마지막 항목 만 표시합니다.

    3 행에서 그는 파일 이름에 대한 새로운 변수를 만들고 "basename"명령을 사용하여 $ 1의 모든 것을 참조합니다 파일 확장자. 이것은 basename을 사용하고 인수로 $ 1을 부여한 다음 공백과 파일 확장자를 추가하여 수행됩니다. 파일 확장자는 라인 2를 참조하는 변수 때문에 자동으로 추가됩니다.

    맛있는 파일 .mp3

    그것을

    맛있는 파일

    마지막 줄에서 Myles는 모든 것을 순서대로 출력 할 명령을 모았습니다. 스크립트에 대한 두 번째 인수 인 $ 2에 대한 참조가 없음에 유의하십시오. 이 특정 스크립트는 대신 현재 디렉토리에 파일을 복사합니다. 위대한 일 사무엘과 마일즈!

    스크립트 및 $ PATH 실행

    스크립트가 기본적으로 명령으로 참조 될 수 없다는 것을 Basics article에서 언급합니다. 즉, 스크립트를 실행하려면 스크립트의 경로를 가리켜 야합니다.

    ./스크립트

    ~ / bin / script

    그러나 스크립트를 ~ / bin /에두면 어디서나 이름을 입력하여 실행할 수 있습니다.

    Commenters는 현대 Linux 배포판이 기본적으로 해당 디렉토리를 생성하지 않기 때문에 이것이 얼마나 적절한 지 논란을 불러 일으켰습니다. 게다가 아무도 기본적으로 $ PATH 변수에 아무 것도 추가하지 않으므로 스크립트와 같은 명령을 실행하는 데 필요합니다. 내 $ PATH 변수를 확인한 후 주석가가 옳았 기 때문에 스크립트를 호출하는 것은 여전히 ​​저에게 효과적 이었기 때문에 조금 당황했습니다. 왜 그런지 알게되었습니다. 많은 현대 리눅스 배포판은 사용자의 홈 디렉토리에 특수 파일을 만듭니다. - .profile.

    이 파일은 bash에 의해 읽히고 (사용자의 홈 디렉토리에 .bash_profile이 없으면), ~ / bin / 폴더가 있으면 $ PATH 변수에 추가하는 섹션이 있습니다. 그래서 그 수수께끼는 사라졌습니다. 시리즈의 나머지 부분에서는 ~ / bin / 디렉토리에 사용자 스크립트이기 때문에 스크립트를 계속 배치 할 것이며 사용자가 실행할 수 있어야합니다. 그리고 일을 처리하기 위해 $ PATH 변수를 손으로 엉망으로 만들 필요가없는 것처럼 보입니다..

    루프가있는 명령 반복

    반복적 인 작업을 처리하기 위해 괴짜 병기구에서 가장 유용한 도구 중 하나 인 루프를 살펴 보겠습니다. 오늘 우리는 "for"루프에 대해 논의 할 것입니다..

    for-loop의 기본 개요는 다음과 같습니다.

    LIST의 VARIABLE에 대한; 해야 할 것
    command1
    command2
    ...
    명령
    끝난

    VARIABLE은 모든 변수가 될 수 있지만 대개 소문자 "i"는 규칙에 따라 사용됩니다. LIST는 항목 목록입니다. 여러 항목을 지정하거나 (공백으로 구분), 외부 텍스트 파일을 가리키거나 별표 (*)를 사용하여 현재 디렉토리의 파일을 나타낼 수 있습니다. 나열된 명령은 관습에 따라 들여 쓰기되어 있으므로 중첩 된 것을 쉽게 볼 수 있습니다. 즉 루프에 루프를 넣는 것입니다 (따라서 루프하는 동안 루프 할 수 있습니다).

    목록은 분리 문자로 공백을 사용하므로 공백은 목록의 다음 항목으로 이동한다는 것을 의미하므로 이름에 공백이있는 파일은 그리 친숙하지 않습니다. 지금 당장은 공백없이 파일 작업에 집중하겠습니다. 간단한 스크립트로 시작하여 현재 디렉토리에있는 파일의 이름을 표시하십시오. ~ / bin / 폴더에 "loopscript"라는 새 스크립트를 만듭니다. 실행 방법을 표시하고 해시 뱅 해킹을 추가하는 방법을 기억하지 못한다면 bash 스크립팅 기본 사항 문서를 참조하십시오..

    여기에 다음 코드를 입력하십시오.

    아이템 1 아이템 2 아이템 3 아이템 4 아이템 5 아이템 6; 해야 할 것
    echo "$ i"
    끝난

    스크립트를 실행할 때 해당 목록 항목을 출력으로 가져와야합니다.

    아주 간단하고 맞습니까? 우리가 사물을 조금 바꾼다면 어떻게되는지 봅시다. 다음과 같이 스크립트를 변경하십시오.

    내가 들어있는 *; 해야 할 것
    echo "$ i"
    끝난

    폴더에서이 스크립트를 실행하면 출력에 포함 된 파일 목록을 가져와야합니다.

    이제 echo 명령을 좀 더 유용한 것으로 바꾸자. 예를 들어 zip 명령. 즉, 파일을 아카이브에 추가합니다. 그리고 믹스에서 몇 가지 주장을 해봅시다.!

    나는 $ @에 들어있다. 해야 할 것
    zip 아카이브 "$ i"
    끝난

    새로운 것이 있습니다! "$ @"는 "$ 1 $ 2 $ 3 ... $ n"의 바로 가기입니다. 즉, 지정한 모든 인수의 전체 목록입니다. 이제 여러 입력 파일로 스크립트를 실행하면 어떻게 될지 살펴보십시오..

    내 폴더에있는 파일을 볼 수 있습니다. 6 개의 인수를 사용하여 명령을 실행했으며 각 파일은 "archive.zip"이라는 압축 아카이브에 추가되었습니다. 쉽고, 옳은?

    for 루프는 꽤 훌륭합니다. 이제 파일 목록에서 일괄 처리 기능을 실행할 수 있습니다. 예를 들어, 모든 스크립트의 인수를 압축 아카이브로 복사하고 원본을 다른 폴더로 이동 한 다음 해당 zip 파일을 원격 컴퓨터에 자동으로 복사 할 수 있습니다. SSH로 키 파일을 설정하면 암호를 입력 할 필요가 없으며 업로드 후에 zip 파일을 삭제하도록 스크립트에 지시 할 수도 있습니다!


    for-loops를 사용하면 디렉토리의 모든 파일에 대해 일련의 작업을 쉽게 수행 할 수 있습니다. 매우 다양한 명령을 함께 쌓아 올릴 수 있고 인수를 사용하여 매우 쉽게 목록을 작성할 수 있습니다. 이것은 빙산의 일각에 불과합니다.

    Bash 스크립터, 제안 사항이 있습니까? 루프를 사용하는 유용한 스크립트를 만들었습니까? 시리즈에 대한 생각을 나누고 싶습니까? 몇 가지 의견을 남기고 다른 스크립팅 초보자를 도와주세요.!