
組み込みの環境変数を使用して、ファイルを .junk ディレクトリに移動するコードを作成しようとしています。私の目標は、ユーザーがshjunk filename1 filename2 filename3...を入力するだけで、スクリプトが$ 1、$ 2、$ 3 ...を使用してファイルを移動することです。残念ながら、カウンターループが正しく機能しません。
#!/bin/s
if [ $# = 0 ]
then echo "Usage: junk -l | -p | { filename }*"
elif [ $1 = "-l" ] && [ $HOME/.junk ]
then ls $HOME/.junk
elif [ $1 = "-p" ] && [ $HOME/.junk ]
then rm -r $HOME/.junk
elif [ $1 = "$@" ] && [ $HOME/.junk ]
then echo $#
i=1
s="$"
while [ $i -le $# ]
do
echo $s$i
mv $s$i .junk/$i
i=$(($i+1))
done
fi
答え1
いくつかの即時の質問:
getopts
パラメータ処理に使用または使用しない理由があります。- スクリプトに複数のパラメータが指定されている場合、
"$@"
3番目のパラメータはelif
スクリプトを吹き飛ばします。 for f in "$@"
ループの代わりにループを使用してくださいwhile
。
なぜ?
sh junk --help
...またはもっと興味深いオプションを入力するとmv
どうなりますか?- 量子電気力学
- より簡単=>より良い
答え2
#!/bin/sh
junkdir="$HOME/.junk"
do_list=false
do_purge=false
while getopts 'lp' opt; do
case "$opt" in
l) do_list=true ;;
p) do_purge=true ;;
*)
printf 'Usage: %s [-l|-p] [ name ... ]\n' "$0" >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ ! -d "$junkdir" ] && ! "$do_purge"; then
printf '%s: Missing junk directory "%s"\n' "$0" "$junkdir" >&2
printf '%s: Re-run with -p to create it\n' "$0" >&2
exit 1
fi
if "$do_list"; then
printf 'Current junk in "%s":\n' "$junkdir"
ls -l "$junkdir"
fi
if "$do_purge"; then
printf 'Emptying junk directory "%s"\n' "$junkdir"
rm -rf "$junkdir"
mkdir "$junkdir"
fi
if [ "$#" -eq 0 ]; then
exit
fi
echo 'Junking the following things:'
printf '%s\n' "$@"
mv "$@" "$junkdir"
このスクリプトはあなたが望むものを達成します。コマンドgetopts
ラインフラグ-l
および/または-p
。
andが発生する順序をdo_list
制御したいので、コマンドラインオプションを解析するwhileループにandを設定しています。do_purge
ユーザーがごみ箱ディレクトリの内容を使用したり表示したい場合ls
rm
-lp
-pl
今後削除されました。
ごみ箱ディレクトリを削除すると再-p
生成されます。単純化のためにrm -rf
これをしましたmkdir
。
コマンドライン解析ループの後、オプションではなく引数(ファイル名および/またはディレクトリ名)のみが含まれるように位置引数を調整します。
場所引数(0)がないと、ファイルをごみ箱ディレクトリに移動しよ$#
うとしません。mv