매개변수는 여러 개이지만 스위치는 하나만 있는 기능

매개변수는 여러 개이지만 스위치는 하나만 있는 기능

내가 만든 일부 스크립트를 사용하여 효과적으로 휴지통을 만들고 있습니다.

첫 번째 스크립트는 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 file1moveToBin -i -v file1moveToBin -- -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
$ 

관련 정보