Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中使用可分辨行符号#提取子数组_Linux_Bash_Shell - Fatal编程技术网

Linux 在bash中使用可分辨行符号#提取子数组

Linux 在bash中使用可分辨行符号#提取子数组,linux,bash,shell,Linux,Bash,Shell,我将一些命令行存储在一个文本文件中,并使用可分辨的行符号将它们分成不同的组,比如第一组为#step1,第二组为#step2,等等。我的问题是如何使用#step*作为输入参数来提取每个组并执行每个命令行 步骤文本文件: #step1 command line 1 command line 2 command line 3 ... #step2 command line 4 command line 5 command line 6 ... 如何在我的代码上下文中的某个地方创建函数,可以执行以下操

我将一些命令行存储在一个文本文件中,并使用可分辨的行符号将它们分成不同的组,比如第一组为#step1,第二组为#step2,等等。我的问题是如何使用#step*作为输入参数来提取每个组并执行每个命令行

步骤文本文件:

#step1
command line 1
command line 2
command line 3
...
#step2
command line 4
command line 5
command line 6
...
如何在我的代码上下文中的某个地方创建函数,可以执行以下操作:

execSteps "#step1"
或者是否有其他方法来组织我的steps文本文件

有什么想法吗

多谢各位

一种方法:

getSteps() {
  local running=0
  while read -r line; do
    if (( running )); then
      if [[ $line = "#"* ]]; then
        return
      else
        printf '%s\n' "$line"
      fi
    else
      [[ $line = "#"$1 ]] && running=1
    fi
  done <stepFile
}

execSteps() {
  getSteps "$@" | sh -
}
getSteps(){
本地运行=0
当读取-r行时;执行
如果((运行));那么
如果[[$line=“#”*];则
返回
其他的
printf'%s\n'$行
fi
其他的
[[$line=“#“$1]]&&running=1
fi

完成听起来您只是想定义一个shell“模块”。将其另存为
mymodule

step1 () {
    command line 1
    command line 2
    command line 3
}

step2 () {
    command line 4
    command line 5
    command line 6
}
要使用它,只需从脚本中获取它的源代码,并调用所需的函数

. mymodule
# Run step 1
step1

# Run step 2

这根本不是一个数组,除非你想将所有步骤存储在内存中,而不是每次都通过文件进行解析。这…实际上是合理的,但无论是否这样做,它都不是规范的一部分。我想这样做的原因是每次在我的计算机上安装Gentoo Linux的新版本时,包名保持不变,但使用标志总是会更改。我决定将要安装的包名存储到文本文件中,并将它们分成不同的组,这样我就可以接受使用标志作为输入参数,而不必担心过程,并一次又一次地键入“emerge packagename”。即使我已经存储了整个过程在一个可执行脚本文件中,当新版本Gentoo stage和portage可用时,更新使用标志是很无聊的。其他新兴软件包是一些命令行,如“cp”、“mkdir”、“rc update”,它们也必须在这些新兴步骤中混合使用,这意味着它们被分成不同的步骤,作为emer存储在一个文本文件中没有。此线程主要是关于如何处理这些分组的命令行。Hmm。如果要在当前shell中执行这些组,可能需要
eval“$(getSteps“$@”)
而不是使用
getSteps“$@”|sh-
,它在一个单独的子shell中执行这些步骤。如果这些步骤不在同一个shell中,您能建议会发生什么情况吗?我使用
chroot
远程运行
emerge-package
。这有关系吗?非常感谢您,Charles!它对我非常有用。嗨,Charles,如果我想进一步,sa在函数getSteps()的第行
printf“%s\n'$line”
中,将此步骤分为两个子步骤,子步骤1:execute
emerge——假装$line(packagename)
,手动收集使用标志,并设置make.conf,子步骤2:execute
emerge$line(packagename)
。我进一步的问题是如何在这个while循环中执行emerge?不要担心其他事情。再次感谢你。上面的评论过于密集,无法明确理解。我建议问一个新问题,专门针对你遇到问题的地方,并将你确实理解的部分考虑在内。@Taowan,请添加你用你的扩展版代码来回答自己的问题——你建议的编辑太过宽泛,无法包含在这里,但我很乐意将其作为一个单独的答案进行补充。(是的,我将所有评论都视为标签;这是有意的,因为这个问题不太清楚什么是标签,什么不是标签)@ MikeWise,请考虑对您批准的编辑建议更加谨慎。您批准的更改建议代码具有大量与实际问题无关的功能,并且它所做的其他调整与未声明的(而不是明确的)要求有关。