Bash:逐行读取文件,拆分行,作为命令行arg传递

时间:2016-10-03 15:19:41

标签: bash file split line command-line-interface

我正在阅读test.txt文件。格式:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    a="$line" | cut -c1-2
    b="$line" | cut -c3-4
    c="$line" | cut -c5-6
    d="$line" | cut -c7-8
    e="$line" | cut -c9-10
    f="$line" | cut -c11-12
    g="$line" | cut -c13-14
    h="$line" | cut -c15-16
    i="$line" | cut -c17-18
    j="$line" | cut -c19-20
    k="$line" | cut -c21-22
    l="$line" | cut -c23-24
    m="$line" | cut -c25-26
    n="$line" | cut -c27-28
    o="$line" | cut -c29-30
    p="$line" | cut -c31-32
    #./a.out "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h" "$i" "$j" "$k" "$l" "$m" "$n" "$o" "$p"
    echo "$line"
    echo "$a $b $c $d $e $f $g $h $i $j $k $l $m $n $o $p"
done < test_10.txt

我正在逐行读取此文件并将其拆分为(例如,第1行:79 03 3d 01 35 a2 1e 45 c6 0e 28 37 85 f5 91 4b)

bash脚本是:

def test_list():
    tests = ['t1','t2','t4','t5','t7']
    return tests

app.conf.update(
    CELERYBEAT_SCHEDULE={
        'schedule_task':{
            'task':'test_celery.tasks.test_scheduler',
            'schedule': timedelta(seconds=10),
            # 'args': (test_list(),)
        }
    }
)

@app.task
def test_scheduler():
    tests = test_list()
    for test in tests:
        print "RUNNING TEST {}".format(test)

目前我只是想打印变量。我打算稍后将它们作为命令行arg传递给我的C ++程序。

问题是,我无法打印变量。当然我的C ++程序也不能接受参数。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要命令替换,$(),(以及echo):

a=$(echo "$line" | cut -c1-2)

此处命令echo "$line" | cut -c1-2的STDOUT将保存为变量a

您可以使用此处字符串<<<来传递变量内容,而不是创建匿名管道:

a=$(cut -c1-2 <<<"$line")

现在选择任何方法,并将其应用于所有其他方法。

答案 1 :(得分:1)

要使管道按预期工作,$line的内容需要转到stdin,例如通过echo

此外,您需要使用带有反引号的command substitution$()(后者是首选方法)将变量设置为命令的结果,否则它将尝试评估输出echo "$line" | cut -c1-2作为命令本身,可能会给您command not found错误。

例如,您的第一个作业应该是

a=$(echo "$line" | cut -c1-2)

其他人会遵循类似的模式。