首页 > 解决方案 > Bash 练习为另一个脚本提供多个输入

问题描述

我遇到了另一个准备考试的练习,我总是觉得输入/输出的重定向很棘手。

它要求:编写一个名为“contaseparatamente.sh”的第一个脚本,它接受可变数量的参数,每个参数都是一个文件名。脚本需要在标准输出上写入偶数参数的总行数,在标准错误上写入奇数参数的总行数。(我已经这样做了,它有效):GNU nano 4.8 contaseparatamente.sh

#!/bin/bash

NUMEVEN=0
NUMODD=0
for((i=1; i<=$#; i++)); do
        if((i%2==0))
        then
                NUMEVEN=$((${NUMEVEN} + `wc -l ${!i} | cut -d ' ' -f 1` ))
        else
                NUMODD=$((${NUMODD} + `wc -l ${!i} | cut -d ' ' -f 1` ))
        fi;
done
echo rows of even ${NUMEVEN}
echo rows of odd ${NUMODD} 1<&2

然后它要求:编写第二个脚本以启动并执行第一个脚本,将他作为参数输出的前 7 行ls -S1 /usr/include/*.h最后这个第二个脚本必须在标准错误上显示第一个脚本的输出。这是我的尝试:GNU nano 4.8

#!/bin/bash
./contaseparatamente.sh <( ls -S1 /usr/include/*.h | head -n 7 ) 2<&1

但以这种方式,结果是偶数为 0 行,奇数为 7,这是不可能的

标签: linuxbash

解决方案


我不喜欢这个任务,但是...

要以最简单的方式传递参数,请使用不带引号的子外壳。(

#!/bin/bash
./contaseparatamente.sh $( ls -S1 /usr/include/*.h | head -n 7 ) 

如果您什么都不做,第一个脚本的标准错误将在您运行第二个脚本时显示出来。如果您在标准输出上需要它,只需重定向。

#!/bin/bash
./contaseparatamente.sh $( ls -S1 /usr/include/*.h | head -n 7 ) 2>&1

推荐阅读