如何使用bash中的变量设置命令行参数

时间:2017-06-15 03:44:59

标签: bash curl

我设置了一个命令行参数如下:

$TOKENARG='Authorization: Bearer 9042f9a3caacc63419be489aefec02a5eae338c33' 
curl -v -X DELETE -H $(echo $TOKENARG) http://localhost:3001/api/v1/articles/3

期望的结果是:

curl -v -X DELETE -H 'Authorization: Bearer 9042f9a3caacc63419be489aefec02a5eae338c33' http://localhost:3001/api/v1/articles/3

但是当我运行上面的那个时它没有按预期工作并返回以下消息:

  卷曲:(6)无法解决主持人:持票人   *重建网址:9042f9a3caacc63419be489aefec02a5eae338c33
   无法解析主持人:9042f9a3caacc63419be489aefec02a5eae338c33

我应该如何使用变量传递参数?

1 个答案:

答案 0 :(得分:0)

因为您没有引用命令替换,所以字符串分为三个单词9042f9a3caacc63419be489aefec02a5eae338c33curl -v -X DELETE -H "$(echo $TOKENARG)" http://localhost:3001/api/v1/articles/3 echo。为了防止这种情况,你可以引用它:

$(command)

但您根本不需要command和命令替换:curl -v -X DELETE -H "$TOKENARG" http://localhost:3001/api/v1/articles/3 具有与$tokenarg='Authorization: Bearer 9042f9a3caacc63419be489aefec02a5eae338c33' curl -v -X DELETE -H "$tokenarg" http://localhost:3001/api/v1/articles/3 相同的输出,因此您可以使用

static final Pattern UNICODE = Pattern.compile("\\\\u([0-9a-fA-F]{4})");

static String decodeUnicodeEscape(String s) {
    Matcher m = UNICODE.matcher(s);
    StringBuffer sb = new StringBuffer();
    while (m.find())
        m.appendReplacement(sb,
            String.valueOf((char)Integer.parseInt(m.group(1), 16)));
    m.appendTail(sb);
    return sb.toString();
}

旁注:所有大写变量名只能用于环境变量,例如参见POSIX spec(第四段),所以最好是

System.out.println(decodeUnicodeEscape(" vi\\u1EC7t nam"));