理解我的 shell 脚本

理解我的 shell 脚本

我编写了一个在 bash 中使用的函数来自动挂载一个目录,~/tmp如果不存在则创建一个目录:

# mkdir & mount auto
mnt() {
    dir="$1";
    mkdir ~/tmp/$dir;
    /usr/bin/sudo mount /dev/$dir ~/tmp/$dir;
    cd ~/tmp/$dir;
}

几个问题 ...

dir="$1";

将变量 dir 设置为 mnt 之后的输入
- 是否$1需要将其封装在其中,并且每行后面""是否需要有 a ?;如果没有 ,它会工作吗;

/usr/bin/sudo mount /dev/$dir ~/tmp/$dir;

我看了一个 YouTube 视频关于 Bash 中的 $PATH 你需要了解的一切

在脚本中我应该写完整路径......

/usr/bin/sudo 

而不是 ...

sudo

这背后的原因是什么?

答案1

该函数的更好版本:

mnt() {
  typeset dir # for local scope for the variable.
              # assumes ksh88/pdksh/bash/zsh/yash. Replace typeset with
              # local for ash-based shells (or pdksh/bash/zsh)

  dir=$1 # here it's the only place where you don't need the quotes
         # though they wouldn't harm

  mkdir -p -- ~/tmp/"$dir" || return
     # quotes needed. mkdir -p creates intermediary directories as required
     # and more importantly here, doesn't fail if the directory already
     # existed.
     # We return from the function if mkdir failed (with the exit status
     # of mkdir). The -- is for the very unlikely even that your $HOME starts
     # with "-". So you may say it's a pedantic usage here. But it's good
     # habit to use it when passing an arbitrary (not known in advance)
     # argument to a command.

  sudo mount "/dev/$dir" ~/tmp/"$dir" || return
     # Or use /usr/bin/sudo if there are more than one sudo commands in $PATH
     # and you want to use the one in /usr/bin over other ones.
     # If you wanted to avoid calling an eventual "sudo" function  or alias 
     # defined earlier in the script or in a shell customisation file, 
     # you'd use "command sudo" instead.

  cd -P -- ~/tmp/"$dir" # another pedantic use of -P for the case where
                        # your $HOME contains symlinks and ".." components
}

不需要分号。在 shell 提示符下,您可以编写:

cd /some/where
ls

不是

cd /some/where;
ls;

这在脚本中没有什么不同。您可以使用;将命令分隔在一行上,如下所示:

cd /some/where; ls

不过,那么你宁愿写:

cd /some/where && ls

这并不是ls无条件地运行,而是只有在cd成功时才运行。

答案2

问题:

  • $1 需要用“”括起来吗

    简短的回答是肯定的

更多阅读

  • 是否需要有一个 ;每行之后?如果没有 ; ,它会工作吗?

    ;命令分隔符,仅当多个命令位于同一行时才需要,例如:echo "Hello, World"; echo。当命令位于单独的行(如脚本中)时,这是不必要的,但不会破坏任何内容。

  • 为什么我应该指定完整路径而不仅仅是命令名称?

    当您简单地键入命令名称时,系统会分析您的路径以查找该命令的第一次出现。在不同位置使用多个命令并不罕见,尤其是在存在 GNU 工具和相同命令的其他变体的情况下。如果您没有指定正在使用的命令的完整路径,您的 shell 将决定使用哪一个,但它可能不是您真正想要的。

我有点不同意总是指定完整路径,因为根据我的经验,通常没有必要,我只关心它找到该工具的某个版本。虽然也有例外,但我认为在考虑它们之前你应该更好地理解它们。例如,在我的环境中,我们大多数的 unix 机器并不默认使用 GNU 工具,但是许多工具都安装在机器上,因此如果我需要对其中一台机器使用 GNU 版本的工具,我需要指定该工具的完整路径。


mnt() {
    dir="$1";                                   # Sets the value of dir to your first positional parameter
    mkdir ~/tmp/$dir;                           # Creates your a directory named after the value of $dir in $HOME/tmp/
    /usr/bin/sudo mount /dev/$dir ~/tmp/$dir;   # Mounts the device in /dev/$dir to your newly created folder (You better hope you set $1 properly)
    cd ~/tmp/$dir;                              # changes to your newly created/mounted directory.
}

相关内容