【问题标题】:Bash concatenate two outputs on one lineBash 在一行上连接两个输出
【发布时间】:2018-09-07 03:47:02
【问题描述】:

我正在尝试在一行上打印两个输出,如下所示:

4 3

但我得到了这个:

4
3

这是我的两个命令:

find "$1" -type f | wc -1
find "$1" -type d | wc -1 

我尝试将每个变量分配给一个变量,然后使用echoprintf 将它们组合起来,但似乎没有任何效果。

【问题讨论】:

标签: bash concatenation computer-science


【解决方案1】:

我无法重现您的问题。

var1=`find "." -type f | wc -l`
var2=`find "." -type d | wc -l`
echo $var1 $var2
8514 93

但是,如果您想替换输入中的任何 \n 字符,请执行以下操作 - 使用 tr 替换输入中的任何换行符。

例如,

echo -e "4\n3" 输出

4

3

echo -e "4\n3" | tr '\n' ' '(用空格替换换行符)

输出

4 3

或者,您可以在将值分配给变量之前添加 tr '\n' ''(用 nothing 替换换行符)。

例子:

var1=`find "$1" -type f | wc -1 | tr '\n' ''`
var2=`find "$1" -type d | wc -1 | tr '\n' ''`

echo "$var1 $var2"

【讨论】:

【解决方案2】:

您应该列出完整的示例,以及您使用的 echo 命令。

罗杰的答案应该有效。

你也可以考虑使用

  • echo -n,例如:

    var1="3"
    var2="4"
    echo -n "$var1"
    echo -n " "
    echo "$var2"
    

    会产生

    3 4
    
  • printf,启用格式化,例如:

    var1="3"
    var2="4"
    printf "%d %d\n" $var1 $var2
    

    会输出

    3 4
    

【讨论】:

  • 很好,我学到了一个 echo 标志,它会阻止我使用 printf 这么多。任何不使用printf 的理由都是一个很好的理由。 :p
【解决方案3】:

这是来自大量经验的事情之一。通过查看 echoprintf,您走在了正确的轨道上。

我将从使用命令替换开始,因为这是我想到的第一个方法。我会将它与echo 结合起来。 (又是那种体验。)您可以在很多地方阅读有关命令替换的信息,尝试谷歌搜索或查看问题和答案here

我们的目标可以表述为执行以下步骤:

#Not real code
$ echo "<number_of_files> <number_of_directories>"

命令替换只允许我们使用命令的输出给我们&lt;number_of_files&gt;&lt;number_of_directories&gt;。为了得到这些输出,我们使用模式$(my_command),它会给出运行的任何输出

$ my_command

在终端给出。希望当您到达我标记的部分时,这会变得更清楚,“我们在这里进行命令替换”,加粗。

我会想象你有一个类似下面的目录结构。 (我称它为no_stack_dir,因为您不希望您的数字一个一个堆叠在一起。)

no_stack_dir/
├── dir1
├── dir2
├── file1
├── file2
├── file3
└── file4

我将通过不创建脚本来简化事情。我不使用"$1",而是使用目录名——在本例中为/home/jsmith147/no_stack_dir。在我展示方法之前,我希望通过使用以下命令来确保我们的目录设置被理解。

$ cd ~

$ pwd
/home/jsmith147

$ls
no_stack_dir

$ls no_stack_dir
dir1    file2
dir2    file3
file1   file4

注意我只有 2 个子目录,因为我们的 find 命令将在找到的目录中包含 no_stack_dir 以及 dir1dir2

这里我们做命令替换,结合echo

我们的&lt;number_of_files&gt;来自命令,

find /home/jsmith147/no_stack_dir -type f | wc -l

而我们的&lt;number_of_directories&gt;来自命令,

find /home/jsmith147/no_stack_dir -type d | wc -l

请注意,我没有将终端提示符 $ 放在这些命令之前。这就是命令替换的用武之地。我们从

#Not real code
$ echo "<number_of_files> <number_of_directories>"

#Real code
$ echo "$(find /home/jsmith147/no_stack_dir -type f | wc -l) $(find /home/jsmith147/no_stack_dir -type d | wc -l)"

我希望我已经通过这些示例说得足够清楚,这样您就可以编写一个脚本(或其他使用 "$1" 的东西)来运行类似

$ ./no_stack.sh /home/jsmith147/no_stack_dir

随时提问。还有许多其他方法可以完成您正在尝试做的事情。也许 SO 社区可以想出许多其他方法来产生相同的输出。在这里列出它们会很有趣。

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 2013-06-22
    • 2011-07-23
    • 1970-01-01
    • 2019-07-18
    • 2010-12-09
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多