내가 만든 일부 스크립트를 사용하여 효과적으로 휴지통을 만들고 있습니다.
첫 번째 스크립트는 rm 명령의 거의 대안입니다(실제로 파일을 삭제하는 대신 삭제된 폴더로 이동합니다).
스크립트가 여러 파일을 삭제된 폴더로 이동하도록 허용했습니다.
sh moveToBin file1 file2 fil3 (similar to: rm file1 file2 file3)
내 첫 번째 스크립트의 시작은 다음과 같습니다.
#!/bin/bash
for param in "$@"
do
..
..
(main part of my code)
각 매개변수(파일)을 삭제된 폴더로 하나씩 이동합니다. 이제 스위치 매개변수 추가를 통합하려고 하는데 어떻게 통합해야 할지 잘 모르겠습니다.
위의 방법은 작동 하지만 첫 번째 매개변수(첫 번째 매개변수만)가 스위치 (삭제 요청), (삭제 확인), (삭제 요청 후 삭제 확인) 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
$