와일드카드가 포함된 변수로 $1이 포함된 Bash 쉘 스크립트

와일드카드가 포함된 변수로 $1이 포함된 Bash 쉘 스크립트

현재 지정된 파일의 입력을 변수로 찾고 비어 있으면 전체 디렉터리를 처리하는 기본 bash 스크립트가 있습니다.

실행할 때 파일을 지정하면 script.sh file1.txt해당 파일이 처리됩니다.

내가 원하지만 알 수 없는 것은 와일드카드를 사용하여 여러 파일을 지정하는 방법입니다. 예를 들어:

script.sh file*.txt

간단한 루핑이 필요할 것 같지만 이 시나리오와 일치하는 예제를 찾을 수 없습니다.

루프를 실행하려고 하면 첫 번째 일치 항목만 처리됩니다.

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "no argument supplied, pulling all file from tick_tock"

    for i in /var/tank/tick_tock/*.txt; do
        cp "$i" /var/tank/awaiting/
    done
fi
echo "you supplied $1"
cp "$1" /var/tank/awaiting/

답변1

다음을 사용하여 스크립트를 호출하는 경우:

$ script.sh file*.txt

일치하는 항목이 있으면 쉘은 glob을 파일 일치 목록으로 확장합니다. 예를 들어 file1.txt, , file2.txt및 가 있다고 가정하면 file3.txt위 명령은 다음과 동일합니다.

$ script.sh file1.txt file2.txt file3.txt

순서는 다를 수 있지만 중요하지 않습니다.

이 상황에서 파일을 처리하는 한 가지 옵션은 다음과 같은 루프입니다.

while [[ $# -ne 0 ]]; do
    # process ${1}
    shift
done

shift낡은 ${1}것을 버리고옮기다나머지 매개변수는 1만큼 "왼쪽으로 이동"됩니다(2는 1이 되고, 3은 2가 됩니다). 또한 shift업데이트되었습니다 $#.

예를 들어:

#!/bin/bash

while [[ $# -ne 0 ]]; do
    echo ${1}
    shift
done

스크립트를 실행하면 다음이 표시됩니다.

$ ./script.sh a b c
a
b
c
$

답변2

여기서 문제는 와일드카드 패턴이 다음으로 확장된다는 것입니다.많은 종류의의 단일 매개변수가 아닌 매개변수입니다 $1. 그 외 지역은 $2등에 위치해 있습니다 . $3표준 쉘 기능으로는 색인을 생성할 수 없지만 일반적으로 그럴 필요는 없습니다. 액세스 스크립트의 인수 목록을 사용할 수 있습니다 "$@". 그래서:

if [ "$#" -eq 0 ]; then
    echo "no arguments"
else
    echo "$# arguments:"
    for x in "$@"; do
        echo " $x"     # or do whatever with $x
    done
fi

그런 식으로 파일을 인수로 가져오는 스크립트를 cp -- "$@" /var/tank/awaiting/호출합니다 . 다음 매개변수는 옵션으로 간주되지 cp않습니다 .--cp

관련 정보