我有一个程序需要一些命令行参数。
它的执行方式如下:
user@home $ node server.js SOME ARGUMENTS -p PORT -t THEME OTHER STUFF
现在我想为它制作一个可执行的启动器:
#!/bin/bash
node server.js ARGUMENTS GIVEN FROM COMMAND LINE
怎么做?
我想将相同的参数传递给命令(不知道它们的数量和内容)。
有办法吗?
答案 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 b
和c
。 “Quoted”案例将其处理为一个参数:a b c
。 “未加引号”的案例将其处理为3个参数:a
,b
和c
。你会有不满意的用户。
答案 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