bash脚本更改目录并使用参数执行命令

时间:2011-12-03 17:16:28

标签: bash

我正在尝试执行以下任务: 编写一个名为changedir的shell脚本 获取目录名称,命令名称和(可选)一些其他参数。 然后该脚本将更改为指示的目录,并且 执行用提供的参数指示的命令。

这是一个例子:

$ 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添加参数,它就不起作用。我需要做些什么来纠正它?

2 个答案:

答案 0 :(得分:17)

你似乎忽略了你命令的其余参数。

如果我理解正确,你需要做这样的事情:

#!/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" "$@"     # expand remaining arguments, retaining original word separations

更简单,更安全的变体是:

#!/bin/sh
cd "$1" && shift && "$@"

答案 1 :(得分:-1)

由于命令可能有多个参数,我建议使用引号。像这样:

sh changedir.sh /etc "ls -lsah"

如果您忽略了'shift',您的代码将更具可读性:

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

或只是

cd DIRECTORY_HERE; COMMAND_WITH_ARGS_HERE