代码之家  ›  专栏  ›  技术社区  ›  av abhishiek

在shell脚本中传递通配符以剪切命令,并将其存储在变量中

  •  1
  • av abhishiek  · 技术社区  · 7 年前

    我不熟悉shell,我有一个例子,我试图计算特定列的唯一值,以检查它们在稍后将调用的shell脚本中是否有效。

    从我的搜索中,我认为剪切与排序&独特就是好的

    所以我的尝试是

    file=/filepath/*vendor.csv
    file_categories = `cut -d, -f1 $file |sort |unique`
    

    $文件应包含文件名中包含供应商的文件

    但即使在使用命令替换(`)后,$文件也不会被正确的文件名替换,它只是将文件中存在的内容放置在

    我正在尝试的另一个例子是

    a=/stage/scripts/vendor/*.out
    echo $a
    /stage/Scripts/ecommerce/oneclick/nohup.out /stage/Scripts/ecommerce/Vendor/Vendor_Automate_Ingestion_Process.out
    
    wc-l
    
    wc: /stage/Scripts/ecommerce/vendor/*.out:
    
    $(wc -l "$a")
    wc: /stage/Scripts/ecommerce/vendor/*.out:No such file or directory
    

    我想了解如何在命令替换中传递野生字符,以及我可以做些什么来纠正。

    2 回复  |  直到 7 年前
        1
  •  2
  •   tripleee    7 年前

    file 将包含带通配符的文本字符串。插值时 $file 如果没有引号,则shell将其作为通配符进行计算。 echo "$file" 通过适当的引用,可以显示变量的实际值。

    在常规shell变量中存储文件名列表没有好方法。Ksh和其他一些shell都有用于此目的的数组,但它不能移植回泛型 sh 可能不是你想要的 事实上 需要,这取决于您试图实现的最终目标。如果要从与通配符匹配的文件中的字段提取唯一值到字符串中,只需确保赋值中的等号周围没有空格,就可以了。

    file_categories=$(cut -d, -f1 $file | sort -u)
    #              ^ no spaces around the equals sign!
    

    在这里,将通配符存储在变量中是可疑的;如果这是您想要解决的问题,可能只需直接使用通配符。

    不管你在哪里 明确地 如果希望shell扩展通配符并标记字符串,则需要在其周围加上双引号。

    echo "$file_categories"
    

    这个字符串不是机器可读的,因此在变量中捕获它的用途有限。我赌一小笔钱,你实际上只是想直接显示输出,而不是将其存储在变量中,这样你就可以 echo 其价值:

    cut -d, -f1 /filepath/*vendor.csv | sort -u
    

    如果要循环这些值,请通过管道将其进一步传递到 while read -r ...

        2
  •  1
  •   AnythingIsFine    7 年前

    为了让你 wc -l 命令工作,将其称为:

    wc -l $a
    

    请勿引用 a 变量,则外壳需要将其展开以读取 * 通配符值