将命令行参数传递给shell脚本

时间:2017-10-22 09:04:58

标签: linux bash shell awk command-line-arguments

背景资料:

我正在尝试编写一个小的shell脚本,它在.fas文件中搜索模式(字符串)并打印找到模式的行和位置。当我调用shell脚本时,以下代码片段起作用:

脚本(search.sh):

#!/bin/bash

awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}' 100nt_upstream_of_mTSS.fas 

命令行调用:

$ ./search.sh

第一个问题:

当我将脚本更改为:

awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}' 

并在我的bash中执行以下命令行调用:

$ ./search.sh 100nt_upstream_of_mTSS.fas

“没有”发生(某些东西正在运行,但它需要太长时间并且没有结果出现,所以终止该过程。)

值得知道:

  • 我在search.sh所在的目录中
  • 文件100nt_upstream_of_mTSS.fas也位于那里
  • search.sh是可执行的

我可能是“屏幕盲”,但我找不到原因,为什么我无法将命令行参数传递给我的脚本。

解决方案 - 见评论

注意:只有这样才能找到一行中第一个出现的模式。

第二个问题:

此外,我想制作我搜索变量的主题(字符串)。我试过这个:

脚本:

#!/bin/bash
FILE=$1
MOTIF=$2
awk 's=index($0, "$MOTIF"){print "line=" NR, "start position=" s}' "$FILE"

命令行调用:

$ ./search.sh 100nt_upstream_of_mTSS.fas CAATCTCC

想法:第一个命令行参数有效,并且被正确替换。为什么第二个没有正确替换?

到目前为止的解决方案:

脚本:

#!/bin/bash
file=$1
awk -v s="$2" 'i=index($0, s){print "line: " NR, "pos: " i}' "$file"

测试:

Testfile(test.txt):

1 GAGAGAGAGA

2 CTCTCTCTCT

3 TATATATATA

4 CGCGCGCGCG

5 CCCCCCCCCC

6 GGGGGGGGGG

7 AAAAAAAAAA

8 TTTTTTTTT

9 TGATTTTTT

10 CCCCCCCCGA

 $ ./search.sh test.txt GA

将打印:

行:1位:1

行:4位:2

行:6位:1

行:9 pos:2

行:10位:9

此脚本将仅在我的模式的第一个字符的行中打印行和第一个匹配位置。如何设置打印所有结果并使用完整模式?

1 个答案:

答案 0 :(得分:1)

据我所知,您希望将Input_file(您希望通过脚本处理的文件)作为参数传递,如果是这种情况,那么以下内容可能对您有帮助。

cat search.sh
#!/bin/bash
variable=$1
awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}' "$variable"

./search.sh 100nt_upstream_of_mTSS.fas 
相关问题