변수의 내용인 명령을 구현합니다.
주어진 디렉토리에 있는 모든 파일의 이름을 바꿀 수 있는 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
이 루프는 당신이 원하는 것을 수행합니다. 안전을 위해 실제로 파일 이름을 바꾸는 부분을 주석 처리했습니다.