Linux 使用$向Bash和awk传递参数时引用了错误的内容
我试图编写一个bash脚本,接受多个示例名称作为参数,以便调用它们对应的文件,并对这些文件运行一系列步骤。我知道在单独运行每个步骤时,这些步骤都会起作用,但我正在努力使事情更加自动化 我不会在这里粘贴所有步骤,这样它就不会变得太混乱,因为它看起来在下面脚本中的Linux 使用$向Bash和awk传递参数时引用了错误的内容,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我试图编写一个bash脚本,接受多个示例名称作为参数,以便调用它们对应的文件,并对这些文件运行一系列步骤。我知道在单独运行每个步骤时,这些步骤都会起作用,但我正在努力使事情更加自动化 我不会在这里粘贴所有步骤,这样它就不会变得太混乱,因为它看起来在下面脚本中的awk步骤失败,因为它没有在正确的位置替换正确的内容 我希望$SAMPLE来自命令行的输入,我希望$1引用我试图调用的文件中的第一个字段 #!/bin/bash for SAMPLE in "$@" do echo 'awk -
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脚本传递参数
谢谢 脚本中只有一个问题。变量
$SAMPLE\u filename
未定义。我想你的意思是${SAMPLE}\u文件名
。这就是为什么您会得到一个文件.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
看起来很有效-非常感谢!没关系-我说得太快了-我仍然看到以下内容:awk-F t{print 10-23Aug-PI}/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/$SAMPLE/alignments\u virtual/${SAMPLE}_CP_all_viral_old.txt>pattern.txt grep-f/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/pattern.txt/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/$SAMPLE/alignments_viral/hisat2${SAMPLE}viral_old.fasta>tmp.txt您的报价肯定有误。由于您使用单引号,并且从您写下的信息中,我只能得出结论,除了打印$1部分之外,大多数都在单引号之间。我之所以这样说,是因为单引号之间的字符串没有任何形式的变量替换。它们是文本字符串。这与双引号有很大的区别。@K.Yetsko你能把产生上述结果的行写出来吗?@K.Yetsko你写的也是你的
echo
行。pattern.txt
的内容是什么使用set-x
,而不是echo
,来记录命令的执行方式echo
的结果完全不正确;它们显示实际没有发生的替换,因为echo的引用与实际命令的引用不同。或者:printf“%q”awk-F'\t'{print$1}'/path/$SAMPLE/path/$SAMPLE\u filename.txt;echo
可以。感谢您的建议-此命令确实生成了正确的命令日志,而不是echo