2011-12-03 128 views
4

我正在嘗試執行以下任務: 編寫一個名爲changedir的shell腳本,其中 需要一個目錄名,一個命令名和一些附加參數。 然後腳本將切換到指定的目錄中,並且 執行用提供的參數指示的命令。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

謝謝查爾斯....我是把上面的最後一行設爲「$ cmd」「$ @」,使命令成爲可選的「參數」,即如果我運行「./changedir/etc/ls」,它可以正常工作,也可以「./indir/etc/ls -al「也可以正常工作 – frodo

+0

@frodo:是的,你說得對。 '「$ @」'更好,因爲它在傳遞時保留參數。這是我的意思,但不是我寫的! –

-1

由於有大概可以比單個參數更命令,我會建議使用引號。事情是這樣的:

sh changedir.sh /etc "ls -lsah" 

,如果你中省略了 '轉向' 您的代碼會更可讀:

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