我正在编写 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
,如果已经设置),它仍能正常工作。
我建议在命令中使用双引号mkdir
,并且可能还包括--
:
mkdir -- "$dirName"
但请注意,在 shell 脚本中更改当前目录不会导致这呼叫过程的当前目录被更改。这是设计使然(并且适用于大多数(如果不是全部)操作系统,包括 Windows)。当一个程序运行另一个程序时,它并不期望它自己的当前目录将被改变。
每个程序都有自己的环境以及它自己的当前目录。当你启动一个新程序时,它会从启动它的程序继承这个目录,但它有自己的副本。当子进程改变其当前目录,即不是反映在父进程中。
通常,当你想为呼叫者更改目录时,正确的方法是重新考虑你的设计。你真的需要这个吗?
本质上,唯一合理的改变目录的情况是,当你的脚本实际上只是一个命令列表,而这些命令也可以由调用者直接运行。在这种情况下,你可以来源脚本而不是运行它。例如,假设您当前正在使用以下命令运行脚本:
./my_script
然后你可以来源它与:
. ./my_script
还支持以下替代语法:
source ./my_script
Bash shell支持.
和source
内置,并且它们是等价的。(运行help .
或help source
了解详情。)
这将导致脚本中的所有命令在当前 shell 中运行而不是在一个新的 shell 中(当你真正跑步shell 脚本)。