Bash

时间:2015-10-20 00:47:54

标签: string bash

我尝试编写一个简单的bash脚本来计算目录中的文件数,然后添加一个名为file< #files>的新文件。到目录的末尾。我目前的尝试是:

name="out"
num=$(ls -l|wc -l)
echo foo > "${name}${num}"

然而,这给了我一堆空格,产生了文件名out 12。为什么会出现空格,如何在不创建空格的情况下连接这些字符串?

3 个答案:

答案 0 :(得分:9)

OS X(以及一般类似BSD的系统)上, wc -l左边空格 - 将数字填充为8个字符,例如{{ 1}}(_______7由于技术原因在此处代表空格。)

(如果您使用_输出未加引号wc - 例如,echo,您将查看填充,因为shell将“#34;吃掉前导空格;如果双引号命令替换,您将看到它们:echo $(wc -l <<<'dummy')

那就是说,你最好不要同时使用echo "$(wc -l <<<'dummy')"ls - 出于稳健性和性能的原因;使用 globbing 来捕获数组中的所有文件名,并使用数组的元素计数

wc

注意:默认情况下,name='out' files=( * ) # collect all filenames in array echo foo > "${name}${#files[@]}" # use array-element count 包含隐藏项,就像OP *命令一样(因为它不包括ls-A) 使用-a也可以包含隐藏的项目 此外,如果根本没有匹配的项目,Bash将返回模式 as as is ,即shopt -s dotglob;要让Bash返回空字符串,请使用*。 功能

通常,如果你发现自己需要修剪来自命令输出和/或Bash变量的前导和尾随空格

  • 修剪存储在 Bash变量中的值 使用shopt -s nullglob

    read
  • 修剪命令输出 作为管道的一部分或 stdin / a 文件中的行< / EM>

    • 如果要修剪的值有 没有内部空白,您要确保/不要介意内部将空格规范化单个空间每个,管道到 # Single-line value: val=' a b ' read -r val <<<"$val" # $val now contains 'a b' # Multi-line value: # Note: Trims leading and trailing whitespace including newlines, but # preserves *any* interior whitespace, including empty and all-whitespace lines. val=$'\n \t one\n \ntwo\n \n' read -r -d '' val <<<"$val" # $val now contains $'one\n \ntwo' (这是有效的,因为xargs,之后将输入解析为单词,默认情况下将它们传递给xargs实用程序 - 没有shell参与);结果总是 输出行; 警告echo删除嵌入式引号和xargs个实例,除非\ - 逃避它们:

      \
    • 如果保留 line-interior 空白非常重要,请使用 val=$(ls | wc -l | xargs) # $val now contains trimmed count ;请注意 - 与上面的sed不同 - 这是一个基于LINE的解决方案,因此输入行的数量将被保留,包括前导和尾随空或全空白行,将所有空白行修剪为一些(假设 GNU Sed或 BSD Sed):

      read -r d ''
  • 简化方案:使用 echo $'\nfoo \n \n bar \n' | sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g' # -> $'\nfoo\n\nbar' 从值中删除所有空白

    • 单行/每行

      tr
    • 全局
    • ,包括换行

      tr -d '[:blank:]' <<<$'  a   b     c \n foo  ' # -> $'abc\nfoo\n'
      

答案 1 :(得分:2)

http://mywiki.wooledge.org/BashFAQ/004描述了如何简明地计算目录中的项目数。例如,以下代码可能会执行您想要的操作:

shopt -s nullglob dotglob
items=(*)
touch "file${#items[@]}"
echo "${#items[@]} items found, created new file: file${#items}"

但请注意,此计数包括子目录和符号链接,而不仅仅是文件。在您的描述中,您要求提供文件计数,但在您的代码示例中,您似乎也需要子目录等。如果您只想要文件,则必须修改上面的示例,可能使用&#39; find。 -type f&#39;。

答案 2 :(得分:1)

试试这个:

#!/bin/sh
name="out"
num=$(ls -l | wc -l | sed -e 's/ //g')
echo $num

应删除开头的空格。