V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WhatMelon
V2EX  ›  程序员

shell 问题求助

  •  
  •   WhatMelon · 2022-12-23 16:26:11 +08:00 · 2071 次点击
    这是一个创建于 728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 /home/tmp 下 ls 结果如下

    -rw-r--r--. 1 root root 0 12 月 23 15:50 core.1
    -rw-r--r--. 1 root root 0 12 月 23 15:50 core.2
    

    在脚本中我通过

    core_files=`ls -l  /home/tmp/core*'
    

    怎么统计 core_files 这个变量的数量呢

    最后我是通过

    nums=`ls -l /home/tmp/core* | wc -l `
    

    获取数量的,但是感觉有点 low,有没有优雅的方法呢

    第 1 条附言  ·  2022-12-23 17:31:41 +08:00

    不好意思,描述不是很清楚,我再来一遍吧 在/home/tmp 下ls 得到

    -rw-r--r--. 1 root root  0 12月 23 15:50 core.1
    -rw-r--r--. 1 root root  0 12月 23 15:50 core.2
    -rwxr-xr-x. 1 root root 49 12月 23 17:27 test.sh
    

    test.sh 内容如下

    
    #!/bin/bash
    
    shs=`find ./core* `
    
    echo ${shs[@]}
    
    

    bash test.sh 得到结果如下

    ./core.1 ./core.2
    

    现在是想在脚本里获取到shs这个数组的长度(2) 之前是通过ls -l /home/tmp/core* | wc -l取到的 有什么不需要遍历的方法吗

    第 2 条附言  ·  2022-12-23 17:50:40 +08:00

    同事帮忙解决了 修改后的脚本如下

    #!/bin/bash
    
    shs=(`find ./core* `)
    
    echo ${#shs[@]}
    
    11 条回复    2022-12-28 17:18:15 +08:00
    perfectlife
        1
    perfectlife  
       2022-12-23 16:29:21 +08:00
    “怎么统计 core_files 这个变量的数量呢” 这个描述怪怪的
    pheyx
        2
    pheyx  
       2022-12-23 16:34:16 +08:00
    set -- /home/tmp/core*
    echo $#
    daimubai
        3
    daimubai  
       2022-12-23 16:41:10 +08:00
    ll | grep -E 'core*' | wc -l
    xingheng
        4
    xingheng  
       2022-12-23 16:49:39 +08:00   ❤️ 1
    脚本里面尽量不要用 ls ,用 find 替代
    cpstar
        5
    cpstar  
       2022-12-23 16:56:02 +08:00
    何来优雅,就算拿一坨屎堆出来,只要管用,就行
    zhanglintc
        6
    zhanglintc  
       2022-12-23 17:00:10 +08:00
    > `nums=`ls -l /home/tmp/core* | wc -l `

    这个就是很合理的方式呀,一般都这么用。
    顶多就是改善一下删选 core 的方式,比如 3 楼提到的用 grep 来筛选一下。
    ripperdev
        7
    ripperdev  
       2022-12-23 17:49:08 +08:00
    ```bash
    #!/bin/bash

    shs=`find ./core*`
    echo ${shs[@]}
    echo ${shs} | awk '{print NF}'
    ```
    试试这个?
    wxf666
        8
    wxf666  
       2022-12-23 19:42:10 +08:00
    这种 `shs=(`find ./core* `)` 方式,文件名有空格就出错了。。
    geelaw
        9
    geelaw  
       2022-12-23 20:05:27 +08:00 via iPhone
    正确的做法是

    core_files=( ~(N)/home/tmp/core* )
    echo ${#core_files[@]}

    用 ls 之后计算行数的错误在于文件名可以包含 \n
    neroxps
        10
    neroxps  
       2022-12-24 08:52:07 +08:00
    优雅的方式我怕你一周后回来看这个代码你不知道你自己写的什么。
    sngxx
        11
    sngxx  
       2022-12-28 17:18:15 +08:00
    @xingheng 为啥捏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2661 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.