如何在 bash "for loop" 中 "tee" 可变次数?
How do I "tee" variable number of times in a bash "for loop"?
我知道我可以:
ssh archive_server -l user -n "cat text.csv"|tee -a text1.csv|tee -a text2.csv|tee....|tee -a text10.csv
有没有办法循环执行?
for i in `seq 1 10`; do
echo $i
tee ???
done
你不需要循环。 tee
可以被赋予多个文件名参数,因此一次给出所有输出文件即可:
cat text.csv | tee -a text{1..10}.csv
如果文件数量是动态的,您可以在 $()
中使用循环将文件名插入命令行:
cat text.csv | tee -a $(
for i in $(seq 1 $filecount); do
echo text$i;
done)
只需确保输出文件名前缀中没有任何空格,因为空格将被视为参数分隔符。
假设你的shell真的是bash(不是/bin/sh
),你可以build an array (and use a C-style for
loop,这不像非标准的外部命令seq
,是有保证的随处可用 bash 是):
#!/bin/bash
filenames=( )
for ((i=1; i<=10; i++)); do # note that the "10" here can be a variable name
filenames+=( "file$i.txt" )
done
tee -a -- "${filenames[@]}" <text.csv
如果您需要与 /bin/sh
兼容,它会变得有点冗长:
#!/bin/sh
tee_between() (
prefix=; suffix=; start=; end=
set --
i=$(( $start - 1 )); while [ $(( ( i += 1 ) <= end )) -ne 0 ]; do
set -- "$@" "file$i.txt"
done
exec tee -a -- "$@"
)
tee_between "file" ".txt" 1 10 <text.csv
注:
set --
修改当前进程(或者,在本例中,当前函数的)参数列表,将其用作我们可以动态修改的数组。
tee_between() ( )
而不是 tee_between() { }
意味着该函数在 subshell 中运行——一个完全独立的分支进程。由于这个选择,exec
命令将只用 tee
的副本替换那个子 shell,而不是父进程。
我知道我可以:
ssh archive_server -l user -n "cat text.csv"|tee -a text1.csv|tee -a text2.csv|tee....|tee -a text10.csv
有没有办法循环执行?
for i in `seq 1 10`; do
echo $i
tee ???
done
你不需要循环。 tee
可以被赋予多个文件名参数,因此一次给出所有输出文件即可:
cat text.csv | tee -a text{1..10}.csv
如果文件数量是动态的,您可以在 $()
中使用循环将文件名插入命令行:
cat text.csv | tee -a $(
for i in $(seq 1 $filecount); do
echo text$i;
done)
只需确保输出文件名前缀中没有任何空格,因为空格将被视为参数分隔符。
假设你的shell真的是bash(不是/bin/sh
),你可以build an array (and use a C-style for
loop,这不像非标准的外部命令seq
,是有保证的随处可用 bash 是):
#!/bin/bash
filenames=( )
for ((i=1; i<=10; i++)); do # note that the "10" here can be a variable name
filenames+=( "file$i.txt" )
done
tee -a -- "${filenames[@]}" <text.csv
如果您需要与 /bin/sh
兼容,它会变得有点冗长:
#!/bin/sh
tee_between() (
prefix=; suffix=; start=; end=
set --
i=$(( $start - 1 )); while [ $(( ( i += 1 ) <= end )) -ne 0 ]; do
set -- "$@" "file$i.txt"
done
exec tee -a -- "$@"
)
tee_between "file" ".txt" 1 10 <text.csv
注:
set --
修改当前进程(或者,在本例中,当前函数的)参数列表,将其用作我们可以动态修改的数组。tee_between() ( )
而不是tee_between() { }
意味着该函数在 subshell 中运行——一个完全独立的分支进程。由于这个选择,exec
命令将只用tee
的副本替换那个子 shell,而不是父进程。