jq:传递不带引号的字符串参数

时间:2018-09-04 20:26:19

标签: jq

我想传递一个不带引号的参数(默认情况下,JQ arg具有双引号),因为它应该用作过滤器。例如

propt='.properties'
final=($(jq -r -c --arg p $propt '$p' sample.json))
echo $final

sample.json

{
  "type": "object",
  "description": "Contains information",
  "properties": {
    "type": {
      "description": "Type"
        }
   }
}

因此最终它打印出.properties而不是预期的{"type":{"description":"Type"}} 我为此使用bash外壳。

请让我知道我在做什么错。

3 个答案:

答案 0 :(得分:3)

如果我对您的理解正确,那么您就会以为需要在<Button>中设置变量,而不仅仅是让shell进行扩展,从而使您陷入困境:

import React from "react";

class Search extends React.Component {
    constructor(display) {
        super(display);
        this.state = {
            searchingText: ""
        };
    }

    handleChange(event) {
        let searchingText = event.target.value;
        this.setState({
            searchingText: searchingText
        });
        if (searchingText.length > 2) {
            this.props.onSearch(searchingText);
        }
    }

    handleKeyUp(event) {
        if (event.keyCode === 13) {
            this.props.onSearch(this.state.searchingText);
        }
    }

    render() {
        const styles = {
            fontSize: "1.5em",
            width: "90%",
            maxWidth: "350px"
        };
        return (
            <input
                type="text"
                onKeyUp={this.handleKeyUp}
                onChange={() => this.handleChange()}
                placeholder="Tutaj wpisz fraze"
                style={styles}
                value={this.state.searchTerm}
            />
        ); 
    }    
}

输出:

jq

请注意,$ foo上的双引号仍然允许外壳程序将变量扩展为.properties。也就是说,您可能不安全地使用:% foo='.properties' % jq -r -c "$foo" sample.json

答案 1 :(得分:1)

您不能以这种方式使用--arg--arg的值是一个字符串,而不是jq过滤器表达式。如果您执行--arg p .properties,则$p将包含字符串".properties",它将不会被视为程序。通过定义函数,找到一种不同的方式来做您想要的事情。

例如,如果您为程序加上def p: .properties;前缀,则可以像现在使用.|p那样在程序中使用$p,它将访问{ {1}}在上下文中具有任何值。

答案 2 :(得分:0)

由于jq没有“ eval”功能,因此在jq中以编程方式指定路径的合适方法是将JSON数组与jq的ipmo activedirectory Add-type -assemblyName Microsoft.VisualBasic Add-Type -AssemblyName System.Windows.Forms $userref = [Microsoft.VisualBasic.Interaction]::Inputbox("Enter username ", "Prime User") $usertar = [Microsoft.VisualBasic.Interaction]::Inputbox("Enter username", "Target") $userref, $usertar | foreach { if ([bool](Get-ADUser -Filter {samaccountname -eq $_}) -ne $true) { [System.Windows.Forms.MessageBox]::Show("This user does not exist!") } else {Write-Host "User Ok"} } getpath内置插件结合使用

因此,在您的情况下,您可以使用--argjson命令行选项传递感兴趣的路径,例如

setpath

,您的jq程序将使用-—argson p '["properties"]'

不用说,这种方法适用于任意嵌套的路径。