将命令行参数传递给bash中的另一个命令

时间:2013-12-22 16:16:41

标签: linux node.js bash

我有一个程序需要一些命令行参数。

它的执行方式如下:

user@home $ node server.js SOME ARGUMENTS -p PORT -t THEME OTHER STUFF

现在我想为它制作一个可执行的启动器:

#!/bin/bash

node server.js ARGUMENTS GIVEN FROM COMMAND LINE

怎么做?

我想将相同的参数传递给命令(不知道它们的数量和内容)。

有办法吗?

2 个答案:

答案 0 :(得分:7)

在双引号中使用$@变量:

#!/bin/bash

node server.js "$@"

这将提供在命令行上传递的所有参数,并保护可能出现在其中的空格。如果不使用引号,则传递给脚本的"foo bar"之类的参数(即,其字符串值中包含空格的单个参数)将作为两个参数传递给node。来自documentation

  

当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说,“$ @”相当于“$ 1”“$ 2”....

根据另一个答案,编辑添加:我不明白你为什么要使用$*。执行以下脚本:

#!/bin/bash

echo "Quoted:"
for arg in "$*"; do
    echo $arg
done

echo "Unquoted:"
for arg in $*; do
    echo $arg
done

使用以下(假设您的文件保存为script并且可执行):

$ script "a b" c

你会得到:

Quoted:
a b c
Unquoted:
a
b
c

您的用户打算传递两个参数:a bc。 “Quoted”案例将其处理为一个参数:a b c。 “未加引号”的案例将其处理为3个参数:abc。你会有不满意的用户。

答案 1 :(得分:4)

根据您的需要,可能使用$@

#!/bin/bash
node server.js "$@"

(可能带引号)

要记住的是如何与...处理空间。在这方面,$*$@表现不同:

#!/usr/bin/env bash

echo '$@:'
for arg in "$@"; do
  echo $arg
done

echo '$*:'
for arg in "$*"; do
  echo $arg
done

输出:

$ ./test.sh a "b c"
$@:
a
b c
$*:
a b c