
私が作ったいくつかのスクリプトを使って効果的にごみ箱を作っています。
最初のスクリプトは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 file1
moveToBin -i -v file1
moveToBin -- -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
-
答え2
#!/usr/bin/env bash
VERBOSE=n
while getopts "vC:" opt; do
case $opt in
v)
VERBOSE=y
;;
C)
echo got $OPTARG
;;
esac
done
shift $(($OPTIND - 1))
echo "soooo verbose is $VERBOSE"
for x in "$@"; do
echo "still got: $x"
done
次に、次の一般的なchmodderyの後:
$ ./gopt hi there
soooo verbose is n
still got: hi
still got: there
$ ./gopt -v hi there
soooo verbose is y
still got: hi
still got: there
$ ./gopt -C cats -v hi there
got cats
soooo verbose is y
still got: hi
still got: there
$