특정 매개변수를 찾아 명령에 전달

특정 매개변수를 찾아 명령에 전달

라는 파일이 있습니다테스트 스크립트라는 프로그램을 실행해야 합니다.명령 실행다음과 같이:

./run_command <input path>

스크립트에 다음 매개변수를 제공하는 경우:

./test_script argument1=sometext argument2=othertext inputpath=/folder1/folder2/file.txt argument4=moretext

스크립트에서 매개변수를 찾는 방법입력 경로=/folder1/folder2/file.txt그리고 통과/폴더1/폴더2/file.txt도착하다명령 실행? inputpath=/folder1/folder2/file.txt가 항상 세 번째 위치에 있는 것은 아니며 제공되는 인수 수가 다를 수 있다는 점에 유의하세요.

답변1

그리고 zsh:

#! /bin/zsh -
inputpath=(${${(M)argv:#inputpath=*}#*=})
(($#inputpath > 0)) && ./run-command $inputpath

모두 추출합니다s를 inputpath=path스크립트에 대한 인수로 사용하고 비어 있지 않은 인수를 $inputpath배열에 저장합니다. 그런 다음 ./run-command이러한 입력 경로가 발견되면 매개변수로 실행합니다.

POSIXly에서는 다음과 같이 할 수 있습니다.

#! /bin/sh -
run_with_extracted_keyword() (
  cmd="${1?}" keyword="${2?}"
  shift 2
  for arg do
    case $arg in
      ("$keyword="*) set -- "$@" "${arg#*=}"
    esac
    shift
  done
  [ "$#" -gt 0 ] && exec "$cmd" "$@"
)

run_with_extracted_keyword ./run-command inputpath "$@"

GNUly에서는 다음과 같이 할 수 있습니다:

#! /bin/bash -
set -o pipefail
printf '%s\0' "$@" |
  LC_ALL=C grep -zPo '^inputpath=\K(?s:.*)' |
  xargs -r0 ./run-command

답변2

Stéphane이 댓글에서 언급한 것처럼 입력을 제어하고 스크립트 액세스를 제한하여 셸 주입을 방지할 수 있다면 어떻게 될까요?

#!/bin/bash
  
for arg; do
    declare "$arg"
done

echo "$argument1"

sometext

일반적으로 위치 매개변수에 액세스하려면 echo $1, $2, $3... 을 수행합니다.

하지만 이 형식을 사용하면 var=value이 코드가 더 잘 맞을 것입니다.

관련 정보