저는 BASH 프로그래머가 아니며 스크립트를 작성해야 할 때마다 복권이므로 스크립트가 너무 중복되거나 초보자가 작성한 것처럼 보이면 사과드립니다.
서문으로 Windows 컴퓨터에서 두 모니터를 모두 캡처하여 찍은 여러 스크린샷이 있습니다. 나는 그것들을 하위 폴더로 정리했고 그 안에 있는 이미지를 자르는 일반적인 방법을 원합니다. 그런데 Windows에서 생성된 파일 이름, 즉 공백과 괄호가 마음에 들지 않기 때문에 이러한 문자를 제거하고 싶습니다.
위의 상황은 하위 폴더의 파일에 작업을 적용해야 하는 여러 상황 중 하나일 뿐입니다. 나는 파일에 대해 수행하는 작업을 기준으로 스크립트를 구성합니다.
이제 요점은 다음과 같습니다. 스크립트를 작성할 때 보편적이기를 원하므로 함수가 다른 스크립팅 언어처럼 작동하도록 노력하고 꼭 필요한 경우가 아니면 전역 변수를 사용하지 않으려고 노력합니다.
이제 요점은 다음과 같습니다. 결국 문자열을 변수에 할당해야 하므로 서브셸에서 "echo -n"을 사용해야 하고 문자열이 공백이나 기타 문자로 구성된다는 서브셸에서 echo를 사용하는 방법에 대해 읽었습니다. 특수 문자 변수에 할당된 반대 설명입니다.
아래 세 가지 기능을 하나씩 테스트해 보았는데 제대로 작동했습니다. 이는 필요할 때 함수 자체의 값을 강제로 변환한다는 의미입니다.
세 번째 항목에 중첩시킨 후에 제가 아는 유일한 것은 하위 쉘에서 변수를 에코하고 출력을 캡처하는 이 기술을 사용하지 않으면 결코 작동하지 않는다는 것입니다. 하단에 있는 하나의 변수를 제외하고는.
trim_weird_char () {
# set +x
local _bn="$(basename "$1")"
# echo "[twc bn] $_bn"
local _dn="$(dirname "$1")"
# echo "[twc dn] $_dn"
local _fn="$(echo -n $_bn | tr -d ' ' | tr -d '(' | tr -d ') ')"
# echo "[twc fn] $_fn"
local _ifn="$(echo -n "${_dn}"/"${_bn}")"
local _dfn="$(echo -n "${_dn}"/"${_fn}")"
mv "$_ifn" "$_dfn"
echo "$_dfn"
# set -x
}
crop_img() {
# set +x
#$1 = image
#$2 = resize
#$3 = string to add in the output filename before the extension
local _img="$(echo -n "$1")"; # we want the file name and hence we remove the extension by NOT being GREEDY with the removal
local _fn="$(echo -n "${_img%.*}")"
local _ext="$(echo -n "${_img##*.}")"; # we want the extension and hence we remove what comes before by being GREEDY with the removal
local _dfn="$(echo -n "${_fn}${3}.${_ext}")"
convert "$_img" -crop "$2" "$_dfn"
echo "$(echo -n "$_dfn")"
}
crop_smartbe () {
# set -x
# ls -la | awk '{print $5}'
echo -n "Trimming name for $1..."
local _img="$(trim_weird_char "$1")"
echo "done: $_img"
echo -n "Cropping $_img to... "
local _s="$(ls -la "$_img" | awk '{print $5}')"
local _dfn="$(echo -n $(crop_img "$_img" "1080x1920+0+0" "_cropped"))"
local _s_img=$(ls -la "$_dfn" | awk '{print $5}')
echo "$_dnf done: size from $_s to $_s_img"
}
내 테스트 기능의 파일 이름은 다음과 같습니다. (위의 스크립트를 얻었습니다)
gadger@brunas:/brunas/expenses/2020/Demandes de reimbursement/Demandes$ crop_smartbe Full/1261597\ -\ Frais\ Internet\ -\ 1er\ sémestre/Screenshot\ \(142\).png
Trimming name for Full/1261597 - Frais Internet - 1er sémestre/Screenshot (142).png...done: Full/1261597 - Frais Internet - 1er sémestre/Screenshot142.png
Cropping Full/1261597 - Frais Internet - 1er sémestre/Screenshot142.png to... done: size from 292631 to 100694
이를 위해 (crop_smartbe에서)
local _dfn="$(echo -n $(crop_img "$_img" "1080x1920+0+0" "_cropped"))"
...
echo "$_dnf done: size from $_s to $_s_img"
echo -n 기술을 사용했는데도 $_dnf가 여전히 올바르게 할당되지 않았습니다.
echo 함수를 제거하면 스크립트가 중단된다는 점을 당연하게 생각하면 printf를 선호해야 할까요? 아니면 에코를 사용할 필요가 없는 다른 방식으로 스크립트를 다시 작성해야 합니까? 만약 그러하다면?
고마워요 알렉스