현재 지정된 파일의 입력을 변수로 찾고 비어 있으면 전체 디렉터리를 처리하는 기본 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