如果我尝试在连续十个不同的目录中运行相同的脚本,这种方式是否有效,是否有更简洁的命令序列?

0 command-line

对不起,如果这是菜鸟,我不得不选择 Ubuntu 来工作,而且我还不是非常精通输入和输出的复杂性。基本上,我有一堆目录,每个目录都有相同脚本的副本,通常我必须分别进入每个目录,./ 每个脚本,等待两分钟,然后键入“2”以选择一个选项在脚本中途,然后退出并转到下一个文件夹。与我一起工作的一个人说我可以使用 cat 命令和管道来自动输入我想要放入脚本的内容,而不是坐着等待提示,但他没有告诉我怎么做。由于我有十个,我想我应该基本上做以下事情:

for i in $(ls -d [each of the folders]);
    do 
       cd $i;
       echo “2” > input.txt; 
       cat input.txt | ./scriptname.sh;
       rm input.txt;
       cd ..;
    done
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 1. 这是否会/应该工作和 2. 有没有一种不那么笨拙的方法来实现这一点?

gle*_*man 5

一些注意事项:

  1. 不要解析ls。假设要使用当前文件夹中的所有目录,那么

    for dir in */        # note the trailing slash
    
    Run Code Online (Sandbox Code Playgroud)

    IMO“dir”是比“i”更好的varname。

  2. 如果不是每个目录都需要,你可以把它们拼出来

    for dir in dir1 dir2 dir4 ...; do ...
    
    Run Code Online (Sandbox Code Playgroud)

    或使用匹配所需目录的 glob 模式

    for dir in dir[1-46-9] ...; do ...
    
    Run Code Online (Sandbox Code Playgroud)

    或使用数组来保存它们,并遍历数组

    dirs=(dirA dirB dirE dirG)
    for dir in "${dirs[@]}"; do ...      # those quotes are required.
    
    Run Code Online (Sandbox Code Playgroud)
  3. 引用你的变量

  4. 这种模式很好:cd dir; do stuff ...; cd ... 您还可以创建一个子外壳,以便cd在子外壳退出时效果消失。
  5. 可以想象,cd失败了。

所以,这里有一个轻微的替代方案

for dir in */; do
    ( cd "$dir" && echo 2 | ./scriptname.sh )
done
Run Code Online (Sandbox Code Playgroud)