Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux “我该怎么做?”;“三通”;bash中的可变次数”;for loop";?_Linux_Bash_Tee - Fatal编程技术网

Linux “我该怎么做?”;“三通”;bash中的可变次数”;for loop";?

Linux “我该怎么做?”;“三通”;bash中的可变次数”;for loop";?,linux,bash,tee,Linux,Bash,Tee,我明白我可以: 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}.c

我明白我可以:

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
),您可以(并且使用a,它与非标准的外部命令
seq
不同,保证bash在任何地方都可用):

注:

  • set--
    修改当前进程(或者,在本例中是当前函数)的参数列表,将其用作可以动态修改的数组
  • tee_between()()
    而不是
    tee_between(){}
    意味着函数在子shell中运行——这是一个完全独立的分叉过程。根据此选择,
    exec
    命令将仅用
    tee
    的副本替换该子shell,而不是父进程

您是否只想复制
text.csv
多次?为什么不在循环中复制
cp文件$i
?顺便说一句,对于与
tee
不同的情况,您确实需要创建动态确定数量的管道元素,请参见类似的内容,如果不是因为
tee
是一种特殊情况,这可以说是@hek2mgl修改问题的完全重复。我从存档服务器获取ssh数据。动态版本对于包含空格等内容的文件名来说是脆弱的;我会建立一个数组。@Barmar,当然,但我们这里提供了一个学习资源。只有在满足条件A、B和C时才安全的东西需要显式地调用,否则它将在该组环境之外重用。相比之下,教一些明确安全的东西会让人觉得这是一种义务。@Barmar,尽管过度工程是一种东西——但至少,如果你使用的东西有已知的局限性,这些已知的局限性需要被披露,或者你把软件中隐藏的陷阱留给了那些对语言和工具集不太了解而无法识别它们的人(这些人极有可能与我们这里的读者重叠)。@olekb,它当然可以与管道一起工作,但前提是所有10个管道都有一个读卡器。由于
tee
没有缓冲区(文档中没有这样做!),因此,如果这些管道中的任何一个没有连接活动的读卡器,则会阻塞其他所有内容。@olekb,…也就是说,我开始怀疑您真正的问题是否是一个最好的解决方法,包括。。。或者将管道的另一端安装到位。
#!/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
tee_between() (
  prefix=$1; suffix=$2; start=$3; end=$4
  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