이 명령줄을 이해해야 합니다.
file=`echo $1 | xargs -n 1 basename | cut -d '.' -f1`
답변1
파일 이름의 일부(경로 포함)를 변수에 할당합니다 file
. 특히, .
파일 자체의 파일 이름에서 첫 번째 문자 앞의 비트입니다. 즉, 이와 같은 것을 취하고 비트를 /some/path/hello.world
구문 분석합니다 hello
.
한 가지 비결은 명령줄에서 파이프라인의 각 부분을 실행하는 것입니다.
$ thing="/some/path/hello.world"
$ echo "$thing"
/some/path/hello.world
$ echo "$thing" | xargs -n 1 basename
hello.world
$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello
백틱은 파이프의 출력을 반환하고 에 할당하는 데 사용됩니다 file
. 이는 $1
명령줄(해당 스크립트 또는 해당 함수가 속한 쉘 함수에 대한)의 첫 번째 인수입니다.
xargs -n 1 basename
plain 대신 사용하는 유일한 이유는 유틸리티가 표준 입력에서 읽지 않고 표준 입력에서 읽기 basename
때문일 수 있습니다 .basename
xargs
bash
or 에서 동일한 것의 더 짧고 빠른 버전 ksh93
입니다 .
file=${1##*/}
file=${file%%.*}
답변2
$1
이 줄은 제공된 경로(이 줄이 나타나는 스크립트의 첫 번째 매개변수)에서 확장자가 없는 파일 이름을 추출합니다. 결과는 변수에 저장됩니다 file
.
데모:
$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename
답변3
echo
여기서는 and의 조합이 xargs
꽤 이상합니다.
basename
명령줄에서 경로 이름을 가져오고 최종 구성 요소(즉, 일반적으로 마지막 슬래시 다음 부분)를 인쇄합니다. xargs
입력(파이프라인)에서 읽은 단어를 basename
여기에 명령줄에 넣기만 하면 됩니다. 그렇다면 그냥 사용해 보는 것이 어떨까요 basename $1
?
그러나 차이점이 있습니다.
echo $1 | xargs -n 1 basename
인수에 $1
공백이 포함된 경우 xargs
공백으로 나누고 basename
각 단어를 별도로 호출합니다. 최종 결과는 파일 이름의 일부가 선택되는 것입니다.모두다음과 같은 단어는아르미니안은 선언한다.
다른 옵션인 은 한 번만 basename $1
호출됩니다 basename
(단어 분리로 인해 좋은 방법으로 실패합니다).
명령이 하나의 파일 이름만 처리하는 경우 다음과 같이 작성하는 것이 좋습니다.
file=$(basename "$1" | cut -d '.' -f 1)
따옴표 포함. (또는 다음 ${file%%.*}
대신 접미사가 제거된 쉘 확장을 사용하십시오.cut
경.)
반면에 여러 파일 이름을 처리해야 하는 경우 $1
배열을 사용하거나 위치 인수(단순 인수가 아닌 모든 인수)에 전달하는 것이 더 깔끔할 수 있습니다.
답변4
이 줄은 파일 이름(확장자 및 경로 제외)을 변수에 저장합니다 $file
.
상세히:
echo $1
스크립트에 전달된 첫 번째 명령줄 인수를 인쇄하고 에코된 문자열을 파일 이름에서 경로를 제거하는
xargs -n 1 basename
command 에 대한 인수로 전달합니다 . 확장 프로그램을 제거하세요.basename
cut -d '.' -f1
예를 들어 그렇게 한다면
echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1
결과( 에 저장 $file
)는 입니다 test
.