如何在单个命令行中运行具有多个语句的shell脚本?

时间:2017-05-15 20:22:59

标签: bash shell

我正在尝试使用倍数间隔作为参数运行程序。我在shell脚本中使用for循环来执行此操作。但是,我只能逐步运行此代码,如下所示。我想知道是否有办法在单个命令行中运行此命令。我刚开始学习shell语言。我已经尝试了一些命令的组合,例如do和then,但是没有成功。欢迎任何形式的帮助。

谢谢,

for K in 1 $(seq 1 5000000 160000000)
    > do
    > J=$((K+5000000))
    > impute2 -phase -m ../impute2_chr1.map -g ../CHR1_17_04_17.gz -int $K $J -Ne 20000 -o phasing_CHR1_${K}_${J}
    > done

3 个答案:

答案 0 :(得分:1)

for K in 1 $(seq 1 5000000 160000000); do J=$((K+5000000)); impute2 -phase -m ../impute2_chr1.map -g ../CHR1_17_04_17.gz -int $K $J -Ne 20000 -o phasing_CHR1_${K}_${J};done

我觉得'做'不需要自己的;总是有点反直觉,但否则很容易理解。顺便说一下,'then'和'else'遵循相同的逻辑,如:

if [[ 'x' == 'y' ]];then echo 'yes'; else echo 'no'; fi

满足评论:你用;替换换行符。如上所述,除了'do','else','then'之外。如果有疑问,创建一个更简单的形式的东西,看看在哪里;应该用它来使它工作,然后做更复杂的形式。

答案 1 :(得分:1)

在bash中,不同的说明由换行符\n;分隔,但是在多行上构建代码会让您更快地阅读和掌握,因此我建议您离开除非你有特殊需要,否则它会在多行上排除,但我现在无法想到。

答案 2 :(得分:1)

在HOME目录中创建一个名为go的文件,如下所示:

#!/bin/bash
for K in 1 $(seq 1 5000000 160000000); do
  J=$((K+5000000))
  impute2 -phase -m ../impute2_chr1.map -g ../CHR1_17_04_17.gz -int $K $J -Ne 20000 -o phasing_CHR1_${K}_${J}
done

现在使用:

使该文件可执行(只需执行一次)
chmod +x $HOME/go

现在,您可以通过输入以下命令运行多次:

$HOME/go

如果您希望学生能够运行它,请将其存储在/usr/local/bin/go中,并将$HOME更改为/usr/local/bin