我目前有一个 Unix 脚本(用 bash 编写),它执行几个命令来修改一组文件,我用包含其路径的 flist 指定这些文件。该脚本的一般思路是创建一个目录,将 flist 中的文件放在该目录中,然后执行后续过程,其中一些过程是创建更多目录。
我遇到的问题是,我必须在脚本本身中指定目录所在的确切文件路径。因此,我的问题是:有没有办法编写脚本,以便我可以在命令行上输入命令,然后输入我希望脚本执行的目标文件夹的路径,并在初始目录中创建初始目录和脚本创建的所有后续目录,而无需提供任何路径(即“command /destination/path/for/script/”)?
如果这有点冗长,请见谅。我对 Unix 还很陌生,经验很少(因此无法想出更好的措辞)。任何帮助都非常感谢!
答案1
如果我理解正确的话,您问的是怎样将值传递给 bash 脚本。这很简单,例如:
#!/usr/bin/env bash
directory=$1;
echo "Directory is $directory"
$1
是 bash 脚本的第一个命令行参数。$2
是第二个等等。因此,您可以像这样运行上面的脚本:
./foo.sh /path/to/bar
Directory is /path/to/bar
如果您希望命令也成为变量,您可以执行以下操作:
#!/usr/bin/env bash
command=$1;
directory=$2
$command $directory
因此,要运行ls /etc
,您可以像这样运行上面的脚本:
./foo.sh ls /etc
答案2
假设您在某个位置 ( /path/to/originals
) 中有一些文件,并希望将它们复制到目标位置 ( /path/to/destination
),然后对其进行修改。您当前的脚本如下所示:
mkdir /path/to/destination
cp /originals/this-file /path/to/destination
cp /originals/this-other-file /path/to/destination
modify-somehow /path/to/destination/this-file
modify-somehow /path/to/destination/this-other-file
但您不想到处都对 /path/to/destination 进行硬编码。因此,您可以要求使用“第一个位置参数的值”,而不是硬编码/path/to/destination
。正如其他人提到的,第一个位置参数的值是$1
。
所以你的脚本应该是:
mkdir $1
cp /originals/this-file $1
cp /originals/this-other-file $1
modify-somehow $1/this-file
modify-somehow $1/this-other-file
您应该通过添加目标路径作为参数来调用它:
my-script /path/to/destination
我试图让脚本保持简单,但您可以改进它,例如使用单个cp
命令复制多个文件。您还可以使用变量作为/originals
路径(但这不是参数,而是脚本开头的常量声明)
最后,请考虑如果您的文件名有空格,则需要用$1
双引号将其括起来。