내장된 환경 변수를 사용하여 파일을 .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
매개변수 처리에 사용되거나 사용하지 않는 이유가 있습니다.- 스크립트에 2개 이상의 매개변수가 제공되면
"$@"
세 번째 매개변수가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