매개변수의 참조 루프 변수

매개변수의 참조 루프 변수

grep여러 다른 파일에 일부 문자열을 저장하고 새 파일에 저장한 다음 cat해당 파일의 내용을 터미널에 저장하는 스크립트(myscript.sh)에 루프가 있습니다 .

for i in {1..201..5}; do
        grep "Pitch" filename-$i.log | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt

명령줄에서 수행하려는 작업은 다음과 같습니다.

./myscript.sh filename-$i.log

i그런 다음 myscript.sh의 인수에서 참조한 변수를 반복하면서 myscript.sh를 실행합니다 .

내 목표를 올바르게 설명했으면 좋겠습니다.

답변1

다른 파일 이름의 기본 부분을 첫 번째 인수로 스크립트에 전달하려면 루프를 다음과 같이 변경하십시오.

for i in {1..201..5}; do
        grep "Pitch" "${1}-${i}" | cut -d" " -f25
done > pitch.txt

(대시는 항상 존재하고 인수의 일부로 전달되지 않으며 파일 이름의 변수 부분은 항상 끝에 있다고 가정)

답변2

원하는 것이 무엇인지는 확실하지 않지만 내가 얻은 바에 따르면 6개의 디렉터리가 있지만 각 디렉터리에는 이름이 비슷하고 끝에 숫자가 있는 파일이 있습니다. 그러면 다음과 같이 할 수 있습니다:

for arg
do
   for i in {1..201..5}; do
      grep "Pitch" "$arg-$i" | cut -d" " -f25
   done > $arg/pitch.txt
   echo "========Pitch==========="
   cat $arg/pitch.txt
done

답변3

다음 구문을 사용하세요.

for ((i=0; i<=$1; i=(($i + 5)) ))
        grep "Pitch" filename-$i | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt

답변4

bash기능은 다음과 같이 작동해야 합니다.

foo() {
    searchstring="$1"
    shift 1
    echo "========${searchstring}===========" ; 
    grep --no-filename "${searchstring}" "$@" | \
    cut -d" " -f25 | tee "${searchstring,,}".txt 
    }

다음과 같이 호출하세요.

foo Pitch filename-{1..201..5}

작동 방식. grep명령줄에서는 여러 파일 이름이 허용되고 다음 과 같은 코드에서는 문자열 접두사가 bash허용됩니다. 둘 다 단일 .{1..10}forcat>tee

첫 번째 매개변수 foo는 검색 문자열(예: "성냥"), 쉘은 이를 "로 설정합니다.1"- 임시 변수로 이동됩니다 $searchstring."성냥shift 1" 따라서 삭제되었습니다 "$@"에는 파일 이름만 포함됩니다.

관련 정보