환경 변수를 사용한 카운터 루프

환경 변수를 사용한 카운터 루프

내장된 환경 변수를 사용하여 파일을 .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. 스크립트에 2개 이상의 매개변수가 제공되면 "$@"세 번째 매개변수가 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

관련 정보