2011-12-03 4 views
4

다음 태스크를 수행하려고합니다. 이라는 쉘 스크립트를 작성합니다. 은 디렉토리 이름, 명령 이름 및 선택적으로 추가 인수를 사용합니다. 그러면 스크립트가 표시된 디렉토리로 변경되고 은 제공된 인수와 함께 표시된 명령을 실행합니다. 여기에 예를 bash 스크립트를 사용하여 디렉토리를 변경하고 인수를 사용하여 명령을 실행하십시오.

:

$ sh changedir /etc ls -al 

이것은 /etc 디렉토리로 변경하고 명령 ls -al을 실행해야합니다.

지금까지 내가 가진 :

#!/bin/sh 
directory=$1; shift 
command=$1; shift 
args=$1; shift 
cd $directory 
$command 

나는 그것을 변경하고 디렉토리를 나열하는 위의 같은 sh changedir /etc ls를 실행합니다. 하지만 인수를 ls에 추가하면 작동하지 않습니다. 문제를 해결하려면 무엇을해야합니까?

답변

13

명령의 나머지 인수를 무시한 것처럼 보였습니다. 간단하고 안전한 변형이 될 것

#!/bin/sh 
cd "$1"   # change to directory specified by arg 1 
shift   # drop arg 1 
cmd="$1"  # grab command from next argument 
shift   # drop next argument 
"$cmd" "[email protected]"  # expand remaining arguments, retaining original word separations 

: 아마에 하나의 인자보다 더있을 수 있습니다

#!/bin/sh 
cd "$1" && shift && "[email protected]" 
+0

당신에게 찰스 감사 내가 .... : 당신은 '변화'를 ommited 경우

sh changedir.sh /etc "ls -lsah" 

코드는 훨씬 더 읽을 것 위의 마지막 줄을 "$ cmd" "$ @"로 지정하여 명령에 선택적으로 "인수"를 만들 수 있습니다. 즉, "./changedir/etc/ls"를 실행하면 ok 및 "./indir"/etc/ls -al "도 작동합니다. – frodo

+0

@frodo : 네, 맞습니다. ''$ @ ''는 전달 될 때 인자를 보존하기 때문에 더 낫다. 그것은 내가 의미 한 것이지만 쓴 것은 아닙니다! –

-1

때문에 만약 내가 제대로 이해하고

당신은 같은 것을 할 필요가 명령, 나는 따옴표를 사용하는 것이 좋습니다. 이런 식으로 뭔가가 :

directory=$1; 
command=$2; 
cd $directory 
$command 

하거나

cd DIRECTORY_HERE; COMMAND_WITH_ARGS_HERE 
+1

[이 방법은 광기를 발한다] (http://mywiki.wooledge.org/BashFAQ/050). @Charles Bailey의 방법은 인수를 훨씬 깔끔하게 처리합니다. –

+0

더 복잡한 명령을 처리하는 것이 번거롭지 만 간단한 경우에는 여기에서 다루기에 충분해야합니다. 인수가 실제로 명령에 속하고 독자적으로 의미가 없으므로 디렉토리 부분과 명령 부분이 훨씬 더 명확합니다. – dgasper

관련 문제