私のシェルスクリプトを理解する[閉じる]

私のシェルスクリプトを理解する[閉じる]

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
}

セミコロンは必要ありません。シェルプロンプトで次のように書くことができます。

cd /some/where
ls

いいえ

cd /some/where;
ls;

これはスクリプトでも変わりません。;以下を使用して、1行からコマンドを区切ることができます。

cd /some/where; ls

ただし、次のように書くことをお勧めします。

cd /some/where && ls

ls無条件に実行されるのではなく、cd成功した場合にのみ実行されます。

答え2

質問:

  • $ 1を ""で囲む必要がありますか?

    短い答えは「はい」です

もっと読む

  • 各行の後に;が必要ですか? ;なしで動作しますか?

    ;コマンド区切り文字で、複数のコマンドが同じ行にある場合にのみ必要です(例:)echo "Hello, World"; echo。コマンドが別の行(スクリプトなど)にある場合は必要ありませんが、何も中断しません。

  • コマンド名だけを指定するのではなく、フルパスを指定する必要があるのはなぜですか?

    コマンド名のみを入力すると、そのコマンドが最初に表示されるパスが分析されます。特に、GNUツールと同じコマンドの他のバリエーションが存在する場合、さまざまな場所で複数のコマンドを使用することはまれではありません。使用しているコマンドのフルパスを指定しないと、シェルで使用するコマンドを決定しますが、実際には望むものではない可能性があります。

私は少し同意しないいつも私の経験では、通常は必要ではなく、特定のバージョンのツールを見つけることにのみ興味があるので、完全なパスを指定してください。例外もありますが、考慮する前によりよく理解する必要があると思います。たとえば、私の環境では、ほとんどのUnixコンピュータはデフォルトでGNUツールを使用していませんが、多くのツールがコンピュータにインストールされているため、そのコンピュータの1つに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.
}

関連情報