環境変数を使用したカウンターループ

環境変数を使用したカウンターループ

組み込みの環境変数を使用して、ファイルを .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

いくつかの即時の質問:

  1. getoptsパラメータ処理に使用または使用しない理由があります。
  2. スクリプトに複数のパラメータが指定されている場合、"$@"3番目のパラメータはelifスクリプトを吹き飛ばします。
  3. for f in "$@"ループの代わりにループを使用してくださいwhile

なぜ?

  1. sh junk --help...またはもっと興味深いオプションを入力するとmvどうなりますか?
  2. 量子電気力学
  3. より簡単=>より良い

答え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ユーザーがごみ箱ディレクトリの内容を使用したり表示したい場合lsrm-lp-pl今後削除されました。

ごみ箱ディレクトリを削除すると再-p生成されます。単純化のためにrm -rfこれをしましたmkdir

コマンドライン解析ループの後、オプションではなく引数(ファイル名および/またはディレクトリ名)のみが含まれるように位置引数を調整します。

場所引数(0)がないと、ファイルをごみ箱ディレクトリに移動しよ$#うとしません。mv

関連情報