echo를 사용하여 터미널에 값을 표시하지 않고 변수에 값을 할당하는 방법

echo를 사용하여 터미널에 값을 표시하지 않고 변수에 값을 할당하는 방법

내 배쉬 스크립트

#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
    echo $i | sed 's/\(.*\)\..*/\1/'
    cp -v ~/Desktop/library/template.py "$i".py
done

을 작성하면 이 스크립트는 A B.py C D.py수행 중인 작업을 설명하는 A.py B.py C.py D.py
-v플래그 로 변환합니다.cp -v

하지만 나는인쇄하고 싶지 않음편집된 파일 이름 echo $i. 매우 짜증납니다.

어떻게 해야 하나요?
대체 솔루션도 높이 평가됩니다.

답변1

$i문자열의 마지막 점 뒤의 값을 잘라내고 싶습니다 .

다음을 수행할 수 있습니다.

i=${i%.*}

$i이렇게 하면 파일 이름 와일드카드 패턴과 일치하는 가장 짧은 접미사 문자열 .*(점 뒤에 문자열이 옴)이 제거됩니다.

구체적으로 정리 하고 싶은 경우 .py:

i=${i%.py}

cp이는 다음과 같이 명령을 작성할 수 있음을 의미합니다 .

cp -v ~/Desktop/library/template.py "${i%.py}.py"

이것은 루프 본문의 유일한 명령이 되며, 값에 그러한 접미사가 있는 경우 .py파일 이름 접미사를 제거한 다음 추가합니다. 이렇게 하면 접미사의 중복을 피하면서 대상 파일 이름에 항상 파일 이름 접미사가 있는지 확인됩니다.$i.py.py


스크립트 제안:

#!/bin/sh

for string do
    cp -v ~/Desktop/library/template.py "${string%.py}.py"
done

또는,

#!/bin/zsh

for string; cp -v ~/Desktop/library/template.py $string:r.py

... zsh쉘, 대체 짧은 루프 형식 for및 수정자를 사용하여 파일 확장자를 이름에 추가하기 전에 제거합니다 :r..py

다음과 같이 두 스크립트 중 하나를 호출할 수 있습니다.

./script A B.py C D.py

답변2

나는 트릭을 찾았습니다 :

#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
    var=$(echo "$i" | sed 's/\(.*\)\..*/\1/')
    cp -v ~/Desktop/library/template.py "$var".py
done

관련 정보