.sh 스크립트를 사용하여 실행하기 위해 여러 매개변수를 전달하는 방법

.sh 스크립트를 사용하여 실행하기 위해 여러 매개변수를 전달하는 방법

나는목록.txt파일에는 로그 파일 목록이 포함되어 있습니다.

예를 들어

    server_log1
    server_log2
    ........
    server_log50

이러한 로그를 다운로드하는 또 다른 쉘 스크립트가 있습니다. 이것이 작동하는 방식입니다

./script.sh serverlog1

자동으로 만들고 싶습니다. 즉, 각 로그 파일의 이름을 자동으로 전달할 수 있다는 의미입니다.목록.txt처형되었다.

그게 가능합니까? 나는 노력했다

#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done

하지만 성공은 없어

답변1

매개변수를 읽는 가장 간단한 방법은 다음과 같습니다.

각 매개변수는 $IFS현재 정의된 OR에 의해 참조되고 확인됩니다 internal file separator. 기본 문자는 공백입니다.

예를 들어 다음을 살펴보세요.# ./script.sh arg1 arg2

이 예의 인수 목록은 arg1 = $1and 이며 arg2 = $2, 이는 로 다시 작성할 수 있습니다 arg1 arg2 = $@.

또 다른 참고 사항은 로그 목록의 사용입니다. 이 목록은 얼마나 자주 변경됩니까? 내 가정은 매일입니다. 반복 루프의 배열로 디렉터리 출력을 사용하지 않는 이유는 무엇입니까? 예를 들어;

for i in $(ls /path/to/logs); do
  ./workaround.sh $i;
done

또는 더 나은 방법은 functions혼란을 없애기 위해 bash에서 계속 사용하는 것입니다.

function process_file()
{
  # transfer file code/command
}

function iterate_dir()
{
  local -a dir=($(ls $1))
  for file in ${dir[@]}; do
    process_file $file
  done
}

iterate_dir /path/to/log/for

이는 쉘 스크립팅 지식을 향상시키기 위한 제안일 뿐이지만 오류가 발생하는지 알아야 하며 각 스크립트의 코드 및/또는 기능에 대한 세부 사항도 알아야 합니다. 매개변수를 사용하면 -x스크립트 디버깅에도 도움이 됩니다.

로그만 전송 하는 경우 스크립트를 완전히 제거 rsync하고rsyslogsyslog

답변2

xargs -n 1 ./script.sh <list.txt

이 예에서는 표준 입력에서 읽은 단일 인수를 사용하여 여러 번 실행됩니다 xargs../script.sh

list.txt표준 입력은 간단한 쉘 입력 리디렉션을 통해 파일에서 제공됩니다. 이는 list.txt파일에 스크립트와 함께 사용할 매개변수가 한 줄에 하나씩 포함되어 있다고 가정합니다.

스크립트 는 파일의 각 줄에 대해 한 번씩 실행됩니다 ./script.sh.list.txt


-n국기 에 대하여xargs

-n number

옮기다유용number(양의 십진 정수) 인수까지 가능한 한 많은 표준 입력 인수를 사용하십시오 .


또 다른 해결책은 스크립트가 에서 직접 읽거나 list.txt여러 명령줄 인수(항목에서 list.txt)를 가져와 파일을 일괄적으로 다운로드하도록 허용하는 것입니다. 하지만 스크립트의 메커니즘이 무엇인지 모르기 때문에 이를 수행하는 방법을 자세히 설명할 수는 없습니다.

답변3

스크립트 내부에서는 읽기 루프가 필요합니다. 예를 들어 while read ; do ......... ; done < filename행을 $REPLY 변수로 처리합니다.

예를 들어

while read 
do
mv $REPLY $REPLY.old
done < liste.txt

liste.txt의 모든 파일 이름을 filename.old로 바꿉니다.

이제 구조가 완성되었으므로 원하는 바에 따라 필요에 맞게 조정할 수 있습니다."list.txt에 실행될 각 로그 파일의 이름으로." :)

답변4

질문을 잘못 읽었을 수도 있지만 제가 읽는 방식은 개인 스크립트가 여러 매개변수를 사용하도록 하는 방법입니다. 예를 들어 wget은 "wget ​​​​url1 url2 url3"을 수행할 수 있습니다.

전체 스크립트를 "내 스크립트의 줄"이라고 표시된 다음 위치에 붙여넣고 이 파일을 새 스크립트로 저장합니다.

ARGUMENTS=$(echo "$@"| tr " " "\n") ; while read A; do "lines from my script";done < "$ARGUMENTS"

스크립트가 $1을 참조하는 경우 이를 $A로 변경해야 하며 물론 다른 참조도 확인해야 합니다.

매개변수는 $@라는 변수로 구분된 한 줄의 공백에 저장됩니다. 이 해킹은 tr을 사용하여 줄을 래핑하고 이를 ARGUMENTS라는 새 변수에 저장합니다. 나머지 스크립트는 해당 변수의 각 행에 대해 스크립트를 실행합니다.

나는 내 bash 웹 스크레이퍼가 단 하나의 매개변수를 가진 여러 URL을 허용하도록 이것을 작성했습니다. 따라서 일반적으로 여러 매개변수를 허용하는 스크립트에서는 작동하지 않을 수 있습니다.

관련 정보