내가 하고 싶은 일은 파일 목록을 인수로 사용하여 스크립트를 실행하는 것입니다. 내 스크립트에서 이 파일로 xterm과 mplayer를 시작하고 싶습니다.
나는 여러 가지를 시도했습니다.나는 다음과 같이 스크립트를 호출합니다.
myscript.sh *
이것파일 이름은 다음과 같습니다.
"aaa AAA"
"bbb BBB"
"ccc DDD"
(즉, 공백이 포함된 파일 이름) mplayer를 사용하여 재생할 수 있는 사운드, 음악 또는 비디오입니다.
이것이 내가 시도한 것입니다.
다음 명령을 모두 작성하세요.내 스크립트 안에!
나는 시도했다:
다음과 같은일하다. 파일이 인쇄됩니다.
ls -l $@
다음과 같은일하다. 파일이 인쇄됩니다.
IFS='\n' ls -l $*
다음과 같은일하다. 파일이 인쇄됩니다. 이상한 점은
IFS='\n'
여기서는 필요하지 않다는 것입니다. 왜?xterm -e 'ls -l $*; read'
이것확실히파일을 찾았습니다.
FILES=$@ ls -l $FILES
이것확실히파일을 찾았습니다. 여기서 모든 파일 이름은 하나의 긴 파일 이름으로 처리됩니다. (???)
IFS='\n' FILES=$@ ls -l $FILES
이것확실히파일을 찾았습니다.
export FILES=$@ ls -l $FILES
그러나 다음일하다. 파일이 인쇄됩니다.
IFS='\n' export FILES=$@ ls -l $FILES
이제 mplayer를 사용해보세요.
이것일하다.
IFS='\n' export FILES=$@ mplayer $FILES
이것확실히일하다. 그런데 왜 2번이
ls -l
효과가 있는 걸까요? 여기서 mplayer는mplayer
인수 없이 시작한 것처럼 도움말 인쇄를 종료합니다 .xterm -e 'mplayer $*; read'
이것확실히일하다. 파일 이름에 공백이 있는 모든 파일에 대해서는 실패합니다.
IFS='\n' FILES=$@ xterm -e 'mplayer $FILES; read'
질문:변수 에 저장된 파일을 사용하여 $FILES
자체 xterm에서 mplayer를 시작하는 방법은 무엇입니까?
답변1
스크립트의 인수를 mplayer에 전달하려면 xterm에서 다음이 작동해야 합니다.
#!/bin/sh
xterm -e mplayer "$@"
"$@"
이는 크기 조정이 작동하는 방식(항목당 하나의 매개변수) 으로 인해 작동합니다 . xterm
하다아니요명령의 인수를 어떤 방식으로든 해석해 보세요.
실제로 파일 목록을 변수에 넣어야 하는 경우 가장 좋은 방법은 배열 변수를 사용하는 것입니다. 예를 들어:
#!/bin/bash
declare -a FILES
for f; do
if [ -r "$f" ]; then
FILES+=("$f")
fi
done
xterm -e mplayer "${FILES[@]}"
위의 코드는 파일을 필터링하고 읽을 수 있는 파일만 전달합니다. 이는 단지 예일 뿐이며 일반적으로 이러한 유형의 필터링을 수행하지 않습니다. 또한 내보낼 계획이 없으면 일반적으로 변수 이름을 소문자로 사용합니다.
추신: 당신이 하고 있는 일을 토대로 볼 때, mplayer -slave
모드를 이해하고 있습니까?