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

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

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成功した場合にのみ実行されます。

おすすめ記事