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

and*_*čič 3 command-line bash scripts directory

我正在做一个 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.
Run Code Online (Sandbox Code Playgroud)

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

拜托,只是一个建议?:)

Eli*_*gan 8

cd命令会更改您所在的目录。跑去help cd了解详情。

如果dirName是一个 shell变量,其中包含您要转到的目录的名称,则

cd -- "$dirName"
Run Code Online (Sandbox Code Playgroud)

会去那里。例如,如果您从 in 开始/home/my_user_name/SCRIPTS并且变量dirName包含 text foo,那么该命令会将您带到/home/my_user_name/SCRIPTS/foo.

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

cd -- "/home/my_user_name/SCRIPTS/$dirName"
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到主要--论点和引用的使用

  • 在脚本中,通过用户输入时的参数,以接受命令选项开始,-或者--,它通常是一个好主意,通过--选项第一。大多数接受文件名参数的命令都支持这种语法(不过,您应该始终检查)。这意味着所有后续参数都将被解释为文件名而不是选项。

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

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

    就像您根本不使用引号一样,但与单引号( ' ') 不同,双引号允许参数扩展。因此,它们不会阻止$dirName扩展为read命令分配给它的值。但是,与根本不使用引号不同,但与单引号一样,双引号可防止分。这样,如果变量包含空白字符(或存在于 中的字符IFS如果已设置),它仍将正常工作。

    另请参阅Bash 参考手册中的3.1.2 引用

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

mkdir -- "$dirName"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

./my_script
Run Code Online (Sandbox Code Playgroud)

然后你就可以代替来源吧:

. ./my_script
Run Code Online (Sandbox Code Playgroud)

还支持此替代语法:

source ./my_script
Run Code Online (Sandbox Code Playgroud)

Bash shell支持.source builtins,它们是等效的。(运行help .help source了解详情。)

这会导致脚本中的所有命令都在当前 shell 中运行,而不是在新的 shell 中运行(这是您实际运行shell 脚本时发生的情况)。