0

我是尝试学习 bash 编程的脚本语言的新手。

我有一个非常基本的问题。假设我想创建三个文件夹$HOME/folder/ ,例如两个子文件夹folder1folder2.

  1. 如果我在 shell 中执行命令

    mkdir -p $HOME/folder/{folder1,folder2}
    

    文件夹将与子文件夹一起创建。

  2. 如果通过脚本执行相同的操作,我将无法获得预期的结果。如果sample.sh包含

    #!/bin/sh
    
    mkdir -p $HOME/folder/{folder1,folder2}
    

    然后我执行sh ./sample.sh,将创建第一个文件夹,然后创建一个{folder1,folder2}目录。不创建单独的子文件夹。

我的查询是

  1. 与终端命令相比,脚本文件如何工作?即,为什么不一样?

  2. 如何让它发挥作用?

4

3 回答 3

2

bash当调用 as 时表现不同sh,以更接近地模仿 POSIX 标准。改变的一件事是不再识别大括号扩展(POSIX 中不存在)。你有几个选择:

  1. 使用bash ./sample.sh. 这会忽略 hashbang 并明确用于bash运行脚本。

  2. 将 hashbang 更改为 read #!/bin/bash,这允许您自己运行脚本(假设您使用 设置其执行位chmod +x sample.sh)。

    请注意,运行它sh ./sample.sh仍然会失败,因为 hashbang 仅在将文件本身作为可执行文件运行时使用。

  3. 不要在脚本中使用大括号扩展。您仍然可以使用更长的方法来避免重复代码:

    for d in folder1 folder2; do
        mkdir -p "$HOME/folder/$d"
    done
    
于 2013-10-03T12:05:33.103 回答
1

sh 中不会发生大括号扩展。

在 sh 中:

$ echo {1,2}

生产

{1,2}

在 bash 中:

$ echo {1,2}

生产

1 2

bash使用而不是使用执行您的脚本sh,您应该会看到预期的结果。

于 2013-10-03T11:19:46.190 回答
1

这可能会发生,因为虽然您的标签表明您认为您正在使用 Bash,但您可能不是。这是因为第一行:

#/bin/sh

那就是“使用系统默认shell”。那可能不是bash。试试这个:

#!/usr/bin/env bash

哦,请注意你错过了!后 #。我不确定这是否只是一个复制粘贴错误,但你需要!

于 2013-10-03T11:19:47.777 回答