用$传递Bash和awk的参数,引用了错误的东西

时间:2018-05-03 15:50:39

标签: linux bash shell awk

我正在尝试编写一个bash脚本来接受多个样本名称作为参数,以便调用它们对应的文件并对这些文件运行一系列步骤。我知道在单独运行每个步骤时步骤有效,但我正在尝试使事情更加自动化。

我不会粘贴这里的所有步骤,所以它不会太混乱,因为它看起来像是在以下脚本的awk步骤失败,因为它没有替换右边的正确的东西地方。

我希望$SAMPLE来自命令行的输入,我希望$1引用我正在尝试调用的文件中的第一个字段。

#!/bin/bash

for SAMPLE in "$@" 
do
    echo 'awk -F '\t' '{print $1}' /path/$SAMPLE/path/$SAMPLE_filename.txt > pattern.txt'
    awk -F '\t' '{print $1}' /path/$SAMPLE/path/$SAMPLE_filename.txt > pattern.txt
done

当我运行此程序时,程序失败时会出现以下错误:

awk -F '\t' '{print 10-23Aug-PI}' /path/10-23Aug-PI/path/.txt > pattern.txt
awk: fatal: cannot open file `/path/10-23Aug-PI/path/.txt' for reading (No such file or directory)

显然,除非我在运行脚本时输入多个样本名称,否则它将文件名设为$1,然后不设为$SAMPLE

有没有办法重写awk脚本或使用awk之外的其他内容,这样我就可以提取文件中的第一个字段,但仍然可以从命令中将参数传递给bash脚本线?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的脚本中只有一个问题。变量$SAMPLE_filename未定义。我假设你的意思是${SAMPLE}_filename。这就是为什么你得到一个文件.txt而不是10-23Aug-PI_filename.txt

的原因

$1被替换的原因是由单引号引起的。如果您正确计算了echo行,则会注意到$1未加引号,因此会被值$1替换。 awk将按预期工作。

您的脚本的更正版本可以是:

#!/bin/bash
for SAMPLE in "$@"; do
   echo "awk -F '\t' '{print $1}' /path/$SAMPLE/path/${SAMPLE}_filename.txt > pattern.txt"
   awk -F '\t' '{print $1}' /path/$SAMPLE/path/${SAMPLE}_filename.txt > pattern.txt
done