String Bash中不带空格的字符串连接

String Bash中不带空格的字符串连接,string,bash,String,Bash,我试图编写一个简单的bash脚本来计算目录中的文件数,然后在目录末尾添加一个名为file的新文件。我目前的尝试是: name="out" num=$(ls -l|wc -l) echo foo > "${name}${num}" 但是,这给了我一堆空格,导致文件名out 12。为什么会出现空格,如何在不创建空格的情况下连接这些字符串?试试以下方法: #!/bin/sh name="out" num=$(ls -l | wc -l | sed -e 's/ //g') echo $num

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

name="out"
num=$(ls -l|wc -l)
echo foo > "${name}${num}"
但是,这给了我一堆空格,导致文件名
out 12
。为什么会出现空格,如何在不创建空格的情况下连接这些字符串?

试试以下方法:

#!/bin/sh
name="out"
num=$(ls -l | wc -l | sed -e 's/ //g')
echo $num
这应该去掉开头的空白。

OS X(以及一般的BSD类系统)上,
wc-l
左空格将数字填充到8个字符,例如,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu7
\uuuuuuuuuuuuuuuuuuuuuuuuuucode>出于技术原因代表一个空格)

(如果您将
wc
的输出与
echo
一起使用,则-例如,
echo$(wc-l描述了如何简明地计算目录中的项目数。例如,以下代码可能会执行您想要的操作:

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

但是,请注意,此计数包括子目录和符号链接,而不仅仅是文件。在您的描述中,您要求提供文件计数,但在代码示例中,您似乎也需要子目录等。如果您只需要文件,则必须修改上述示例,可能需要使用类似“查找。-键入f”的内容。

OS X约塞米蒂10.10.5.Bash-3.2Try
echo foo>“${name}${num###}”
?这里的想法是使用Bash的前缀移除来移除空格。(在
##
之后有一个空格)如果这不起作用,请尝试
echo foo>“${name}${num#####$'\t}”
作为记录,它与Debian Jessie上的bash 4.3.30和coreutils 8.23配合使用。我猜您的
wc
实现添加了空格,但不确定。@Teofrostus这意味着
wc
添加了空格,因为
echo
没有引号会去除空格。如果执行
echo$num
,shell会删除空格。(分词的这一部分。)当您执行
echo“${num}”
时,shell保留空格。您看到后一种形式的空格意味着
wc
正在添加空格。++(虽然globbing+数组元素计数方法已经是我答案的一部分,但我最初并没有讨论
dotglob
nullglob
)。但是,请注意,OP的重点是调整值,而不是获取文件系统项名称——这一部分他们似乎很满意(该部分-
ls-l
-意味着:任何类型的项,不包括隐藏项;如果有默认的Bash选项,
*
返回相同的集)。还请注意,“文件”通常松散地用于指代所有类型的文件系统项,因为缺少简洁的总括术语。还请注意,
find.-type f
将在当前目录的整个子树中查找文件;您需要
find.-maxdepth 1-type f
将结果限制为直接位于当前目录中的文件(值得一提的是,该命令将始终包含隐藏文件,并且输出文件名将以
/
作为前缀,而不必排序)。这在本例中效果很好,但值得指出的是,
sed
命令会删除所有空格;
sed的/^*/'
更具体地说会删除所有前导空格。
 # 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'
val=$(ls | wc -l | xargs) # $val now contains trimmed count
echo $'\nfoo \n \n bar \n' | sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g'
# -> $'\nfoo\n\nbar'
tr -d '[:blank:]' <<<$'  a   b     c \n foo  ' # -> $'abc\nfoo\n'
tr -d '[:space:]' <<<$'  a   b     c \n foo  ' # -> 'abcfoo'
shopt -s nullglob dotglob
items=(*)
touch "file${#items[@]}"
echo "${#items[@]} items found, created new file: file${#items}"