쉘 스크립트 이름 바꾸기

쉘 스크립트 이름 바꾸기

변수의 내용인 명령을 구현합니다.

주어진 디렉토리에 있는 모든 파일의 이름을 바꿀 수 있는 bash 이름 바꾸기 프로그램을 만들려고 합니다. 다음 프로그램이 있습니다.

for PATHFILE in tracks/*
do
   path="$(dirname "$PATHFILE")"
   file="$(basename "$PATHFILE")"

   program='mv';

   if [[ "$file" =~ ([0-9]*)\s*(.*) ]]
   then

       from=${path}/${file}
       to=${path}/${BASH_REMATCH[1]};

       command_string="$program '$from' '$to'";

       #here the command_string contains the command i want to execute.
       $(command_string);
       #causes error:
       # mv: target ''\''tracks/01'\''' is not a directory.

       break;
    fi

done

직접 명령을 실행하면 문제 없이 실행됩니다. 또한 시스템이 문자열 주위에 이러한 쉼표를 추가하는 이유도 잘 모르겠습니다.

변수를 화면에 표시하면 변수를 복사하고 실행할 수 있으며 오류 없이 실행됩니다. 하지만 코드에서 실행하려고 하면 계속해서 이 오류가 발생합니다.

어떻게 작동하게 합니까?

답변1

먼저 $(command_string)"bash: command_string: command notfound" 오류가 명령 대체로 제공됩니다. 명령 대체는 괄호로 묶인 명령을 실행하고 전체 내용을 해당 명령의 출력으로 바꿉니다.

둘째, 명령을 실행하는 데만 사용하는 경우에도 $command_string파일 이름에 작은따옴표를 추가할 수 있습니다. 파일 이름에는 작은따옴표가 없습니다.

일반적으로 명령을 변수에 넣지 마십시오. 바라보다"변수에 저장된 명령을 어떻게 실행할 수 있나요?".

대신 다음과 같을 수도 있습니다.

#!/bin/bash

for pathname in tracks/*; do
    if [[ "$pathname" =~ ([0-9]+)[[:blank:]]* ]]; then
        newpathname="${pathname%/*}/${BASH_REMATCH[1]}"
        printf 'Would move "%s" to "%s"\n' "$pathname" "$newpathname"
        # mv -i "$pathname" "$newpathname"
        break
    fi
done

이 루프는 당신이 원하는 것을 수행합니다. 안전을 위해 실제로 파일 이름을 바꾸는 부분을 주석 처리했습니다.

관련 정보