在 bash 脚本中,如何转到名称存储在变量中的目录?

在 bash 脚本中,如何转到名称存储在变量中的目录?

我正在编写 FileCreator 脚本:

#!/bin/bash

echo "Welcome to the file creator! Please type the directory name:"
read dirName

mkdir $dirName

#Now I want to change directory to that new $dirName that will be run from Terminal.

我现在的问题是如何更改终端上可见的新目录的路径dirName。因此,最后路径应该是:/home/my_user_name/SCRIPTS/dirName当我运行此脚本时...

请问,这只是一个建议吗?:)

答案1

命令cd变化你在哪个目录中. 运行help cd以了解详情。

如果dirName是 shell多变的包含您要访问的目录的名称,然后

cd -- "$dirName"

将转到那里。例如,如果您从 开始,/home/my_user_name/SCRIPTS并且变量dirName包含文本foo,则该命令将带您到/home/my_user_name/SCRIPTS/foo

如果你总是想dirName被解读为相对路径在 中/home/my_user_name/SCRIPTS,无论用户从哪里运行你的脚本,然后使用:

cd -- "/home/my_user_name/SCRIPTS/$dirName"

你可能已经注意到主要--论点和引用

  • 在脚本中,当传递用户输入时参数接受命令选项-或开头--,通常最好通过选项--首先。大多数接受文件名参数的命令都支持此语法(但您应始终检查)。这意味着所有后续参数都将被解释为文件名而不是选项。

    要理解这一点,请尝试运行ls -l,然后尝试运行。手动输入命令时ls -- -l通常不需要使用该参数。但在将未清理的输入值传递给命令的脚本中,它经常被使用。--

  • 在这两个命令中我都使用了双引号" ")。这通常是在扩展包含文件名的变量时所需要的。

    就像你根本不用引号一样,但不像单引号( ' '),双引号允许参数扩展。因此它们不会阻止$dirName被扩展为命令赋予的值read。但是,与完全不使用引号不同,双引号会阻止单词拆分这样,如果变量包含空格字符(或出现在IFS如果已经设置),它仍能正常工作。

    也可以看看3.1.2 引用在里面Bash 参考手册

我建议在命令中使用双引号mkdir,并且可能还包括--

mkdir -- "$dirName"

但请注意,在 shell 脚本中更改当前目录不会导致呼叫过程的当前目录被更改。这是设计使然(并且适用于大多数(如果不是全部)操作系统,包括 Windows)。当一个程序运行另一个程序时,它并不期望它自己的当前目录将被改变。

每个程序都有自己的环境以及它自己的当前目录。当你启动一个新程序时,它会从启动它的程序继承这个目录,但它有自己的副本。当子进程改变其当前目录,即不是反映在父进程中。

通常,当你想为呼叫者更改目录时,正确的方法是重新考虑你的设计。你真的需要这个吗?

本质上,唯一合理的改变目录的情况是,当你的脚本实际上只是一个命令列表,而这些命令也可以由调用者直接运行。在这种情况下,你可以来源脚本而不是运行它。例如,假设您当前正在使用以下命令运行脚本:

./my_script

然后你可以来源它与:

. ./my_script

还支持以下替代语法:

source ./my_script

Bash shell支持.source 内置,并且它们是等价的。(运行help .help source了解详情。)

这将导致脚本中的所有命令在当前 shell 中运行而不是在一个新的 shell 中(当你真正跑步shell 脚本)。

相关内容