无法使用shell脚本以所需格式输出值

时间:2018-06-09 08:01:03

标签: bash shell format printf echo

我需要以下列格式将数组输出到文件中。

File: a.txt
      b.txt

我尝试了以下操作:

declare -a files=("a.txt" "b.txt")
empty=""
printf "File:" >> files.txt
for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$empty" "$i" >> files.txt
done 

但是,我得到了输出

 File: a.txt
 b.txt

任何人都可以帮助我以所需的格式获得输出。

3 个答案:

答案 0 :(得分:1)

#!/bin/bash

files=( 'a.txt' 'b.txt' 'c.txt' 'd.txt' )

set -- "${files[@]}"

printf 'File: %s\n' "$1"
shift
printf '      %s\n' "$@"

输出:

File: a.txt
      b.txt
      c.txt
      d.txt

这使用printf将其格式化字符串重用于其所有其他命令行参数的事实。

我们将位置参数设置为列表,然后输出前缀为File:字符串的第一个元素。然后,我们将$1从位置参数列表中移开,并使用插入的间隔字符串打印其余部分。

答案 1 :(得分:0)

使用sed

#!/bin/bash

declare -a files=("a.txt" "b.txt")

for i in "${files[@]}"
do
   echo "$i" >> files.txt
done
sed -i '1 s/^/File: /' files.txt
sed -i '1 ! s/^/      /' files.txt

如果您使用的是Mac,则必须以这种方式修改sed命令

sed -i '' '1 s/^/File: /' files.txt
sed -i '' '1 ! s/^/      /' files.txt

输出将是:

File: a.txt
      b.txt

首先,我们将所有文件名(for loop)放入txt文件中。之后,通过第一个sed命令,我们将File:添加到第一行,并通过第二个sed命令添加到所有行,除了第一个,六个空格等于字符串{{的长度1}}

答案 2 :(得分:0)

您可以始终使用包含File:的变量开始第一次迭代,并使用每次正确的空格数覆盖它。重复的任务不会导致过多的开销。

prefix="File:"

for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$prefix" "$i"
   prefix=
done > Files.txt