パラメータは複数ありますが、スイッチは1つしかありません。

パラメータは複数ありますが、スイッチは1つしかありません。

私が作ったいくつかのスクリプトを使って効果的にごみ箱を作っています。

最初のスクリプトはrmコマンドのほぼ代替です(実際にはファイルを削除するのではなく、削除されたフォルダに移動します)。

スクリプトが複数のファイルを削除されたフォルダに移動することを許可しました。

sh moveToBin file1 file2 fil3 (similar to: rm file1 file2 file3)

私の最初のスクリプトの始まりは次のとおりです。

#!/bin/bash
for param in "$@"
do
..
..
(main part of my code)

各パラメータ(ファイル)を削除されたフォルダに1つずつ移動します。これで、スイッチパラメータの追加を統合しようとしていますが、どのように統合するのかわかりません。

上記の方法は機能しますが、最初のパラメータ(最初のパラメータのみ)がスイッチ(削除要求)、(削除確認)、(削除要求後に削除確認)になるsh moveToBin file1 file2 file3可能性をどのように統合しますか?-i-v-iv

したがって、このスイッチはでのみ機能します$1。 getoptsということを試しましたが、使い方に慣れていません。スイッチを使用すると、これは$2将来のケースに適用されます。

sh moveToBin -i file1 file2

これは、file1の削除を要求し、file2の削除を要求することに決めた後、同様のことを考えましたが、うまくいきません。助けが必要ですか?

counter=1
for param in "$@"
do
       while [[ if $param = "-*" && counter -eq1]];
       do 
              getopts "iv" arg;
              case "$arg" in
                  i) read -p "want to delete $param ?" ans
                     if [ ans =~ ^[Y][y] ] 
                     then 
                          #run main code for that param value              
                     fi;;
                  v) #run main code for that param value 
                     echo "file @param deleted";;
              esac
              counter=$((counter+1))
              continue
       done

      #run main code for that param value
done

whileループ条件は、これが最初のパラメータであり、パラメータがハイフンで始まることを意味します。

ベストアンサー1

組み込みのgetopts解析オプション。すべてのオプションに対して一度だけ実行し、残りのオペランド(オプションではなく引数)を処理します。呼び出し元は、またはgetoptsなど必要なものを作成でき、ダッシュで始まるファイル名を処理するように作成できます(それ以降のすべての内容はオペランドとして解釈されます)。moveToBin -iv file1moveToBin -i -v file1moveToBin -- -file--

getopts変数によってOPTINDどのくらいの引数が処理されたかを追跡します。操作が完了すると、OPTIND最初のオペランドのインデックスになります。引数の数は1から始まるので、最初の引数はOPTIND-1オプションであることを意味します。

オプションを解析する限り、処理するファイルのリストは不明です。したがって、変数を設定してそのオプションを覚えて、後でその変数を照会してください。

#!/bin/bash
confirm=
verbose=
while getopts 'iv' OPTLET; do
  case $OPTLET in
    i) confirm=y;;
    v) verbose=y;;
    \?) exit 3;;  # Invalid option; getopts already printed an error message
  esac
done
shift $((OPTIND-1))

for file in "$@"; do
  if [[ -n $confirm ]]; then
    read -p "want to delete $param ?" ans
    if [[ $ans != [Yy]* ]]; then
      continue       # the user said no, so skip this file
    fi
  fi
  … # do that moving stuff
  if [[ -n $verbose ]]; then
    echo "File $file deleted"
  fi
done

最初のオペランドの後の項目は、getoptsオプションではなく従来のオプション構文解析モデルに従います。つまり、 にはオプションがmoveToBin -i foo -v barあり-i、その後には 3 つのファイルfoo-vがありますbar。 GNUオプションの解析モデル(オプションがオペランドと混在する可能性がある場合)を許可したい場合は、getopts特に役に立ちません。 bashのgetopts組み込みGNUロングオプションの解析も失敗します(サポートされていないエラーが追加されました--verbose)。-v -e -r -b -o -s -e-

おすすめ記事