【问题标题】:Can't get array from cmd line argument bash无法从命令行参数 bash 获取数组
【发布时间】:2017-04-16 12:39:21
【问题描述】:

由于某些原因,在下面的代码中 for 循环将 args 视为数组, wc -l 可以正确计算行数,但我无法让 $(#args[@]) 产生正确的计数

function doSomthing() {
local i args a
args=$1;
a=("1" "2" "3" "4");
i=0
  echo wc =`wc -l <<< "$args"`;
  for arg in $args; do
    ((i++))
    echo "$i"
  done;
  echo i = $i
  echo a = ${#a[@]}
  echo args = ${#args[@]}
  echo $args
}

这个函数的输出是

$> doSomthing $'1\n2\n3\n4'
wc =       4
1
2
3
4
i = 4
a = 4
args = 1
1 2 3 4

【问题讨论】:

    标签: arrays bash shell count ksh


    【解决方案1】:

    问题解决了!

    我只需要将 $1 放在括号内。
    出于某种原因,当我尝试它之前它不起作用但现在它起作用了。


    这是新代码:

    function doSomthing () {
        local i args a;
        args=( $1 );
        a=("1" "2" "3" "4");
        i=0;
        echo wc =`wc -l <<< "$args"`;
        for arg in $args; do
            ((i++));
            echo "$i";
        done;
        echo i = $i;
        echo a = ${#a[@]};
        echo args = ${#args[@]};
        echo ${args[@]}
    }
    



    这是新的输出:

    $> doSomthing $'1\n2\n3\n4'
    wc = 1
    1
    i = 1
    a = 4
    args = 4
    1 2 3 4
    

    干杯 ;-)

    【讨论】:

    • 如果您运行doSomething "*",您期望输出什么?如果你从非空目录运行它,我宁愿怀疑你可能会对你得到的输出感到惊讶。
    • 我不确定我是否理解您的问题。我刚刚做了并得到了与以前相同的输出(这是我所期望的)ls -11 2 3 4 doSomthing "*" wc = 1 1 i = 1 a = 4 args = 4 1 2 3 4 我无法正确显示输出在评论中,但它与以前相同。对不起。
    • 如果您愿意,可以尝试以 html 格式查看以下内容:
      $&gt; ls -1
      1
      2
      3
      4
      $&gt; doSomthing "*"
      wc = 1
      1
      i = 1
      a = 4
      args = 4
      1 2 3 4
    • 为什么你希望输出是1 2 3 4,而不是*?毕竟,它被引用了:这应该是字面意思。如果您正在扩展 glob,当它以 使 它成为单个参数的方式传递时不将其视为单个参数,那就是一个错误。
    • 所以,假设您有一个名为 *** i am just one file *** .txt 的文件。愚蠢的名字,里面有一堆空格,但有时存在。现在,无论您如何引用和转义它,您都不能让您的代码将该文件名视为一个参数。这就是我的观点:您现在处理论点的方式是错误。在doSomething "1 2 3 4" "5 6 7 8" 中,您应该有两个 参数,第一个是1 2 3 4,第二个是5 6 7 8
    【解决方案2】:

    args 不是数组;它只是一个包含嵌入换行符的字符串。这意味着,如果您尝试将其视为一个数组,它将看起来好像您将其定义为

    args=( $'1\n2\n3\4' )
    

    不是

    args=(1 2 3 4)
    

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2017-12-05
      • 2014-01-03
      • 2020-07-11
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多