我尝试编写一个简单的bash脚本来计算目录中的文件数,然后添加一个名为file< #files>的新文件。到目录的末尾。我目前的尝试是:
name="out"
num=$(ls -l|wc -l)
echo foo > "${name}${num}"
然而,这给了我一堆空格,产生了文件名out 12
。为什么会出现空格,如何在不创建空格的情况下连接这些字符串?
答案 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
应删除开头的空格。