명명 된 매개 변수를 쉘 스크립트로 전달 (수신)하는 쉬운 방법이 있습니까?
예를 들어
my_script -p_out '/some/path' -arg_1 '5'
그리고 내부 my_script.sh
는 다음과 같이받습니다 :
# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']
printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"
Bash 또는 Zsh에서 가능합니까?
답변
가장 유사한 구문은 다음과 같습니다.
p_out='/some/path' arg_1='5' my_script
답변
당신이 즉, 단일 문자 인수 이름에 한정되는 괜찮다면 my_script -p '/some/path' -a5
, 다음 bash는 당신은 내장 사용할 수 있습니다 getopts
, 예를
#!/bin/bash
while getopts ":a:p:" opt; do
case $opt in
a) arg_1="$OPTARG"
;;
p) p_out="$OPTARG"
;;
\?) echo "Invalid option -$OPTARG" >&2
;;
esac
done
printf "Argument p_out is %s\n" "$p_out"
printf "Argument arg_1 is %s\n" "$arg_1"
그럼 넌 할 수있어
$ ./my_script -p '/some/path' -a5
Argument p_out is /some/path
Argument arg_1 is 5
유용한 Small getopts 튜토리얼이 있거나 help getopts
쉘 프롬프트에서 입력 할 수 있습니다 .
답변
drupal.org 에서 이것을 훔 쳤지 만 다음과 같이 할 수 있습니다.
while [ $# -gt 0 ]; do
case "$1" in
--p_out=*)
p_out="${1#*=}"
;;
--arg_1=*)
arg_1="${1#*=}"
;;
*)
printf "***************************\n"
printf "* Error: Invalid argument.*\n"
printf "***************************\n"
exit 1
esac
shift
done
유일한 경고는 구문을 사용해야한다는 것입니다 my_script --p_out=/some/path --arg_1=5
.
답변
이 스크립트를 사용하고 매력처럼 작동합니다.
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
STEPS) STEPS=${VALUE} ;;
REPOSITORY_NAME) REPOSITORY_NAME=${VALUE} ;;
*)
esac
done
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
용법
bash my_scripts.sh STEPS="ABC" REPOSITORY_NAME="stackexchange"
콘솔 결과 :
STEPS = ABC
REPOSITORY_NAME = stackexchange
STEPS 및 REPOSITORY_NAME을 (를) 스크립트에서 사용할 수 있습니다.
인수의 순서는 중요하지 않습니다.
답변
로에게 zsh
, 당신은 사용하십시오 zparseopts
:
#! /bin/zsh -
zmodload zsh/zutil
zparseopts -A ARGUMENTS -p_out: -arg_1:
p_out=$ARGUMENTS[--p_out]
arg1=$ARGUMENTS[--arg_1]
printf 'Argument p_out is "%s"\n' "$p_out"
printf 'Argument arg_1 is "%s"\n' "$arg_1"
그러나을 사용하여 스크립트를 호출합니다 myscript --p_out foo
.
주 zparseopts
긴 옵션 또는 축약 지원하지 않습니다 --p_out=foo
GNU이 같은 구문을 getopt(3)
수행합니다.
답변
방금이 스크립트를 생각해 냈습니다
while [ $# -gt 0 ]; do
if [[ $1 == *"--"* ]]; then
v="${1/--/}"
declare $v="$2"
fi
shift
done
이 같은 통과 my_script --p_out /some/path --arg_1 5
후 스크립트에서 당신은 사용할 수 있습니다 $arg_1
및 $p_out
.
답변
함수 나 응용 프로그램에 인수가 0 개 이상인 경우 항상 마지막 인수가 있습니다.
다음과 같이 옵션 플래그 및 값 쌍을 읽으려면 다음을 수행하십시오.
$ ./t.sh -o output -i input -l last
가변 개수의 옵션 / 값 쌍을 허용하려고합니다.
거대한 “if .. then .. else .. fi”트리를 원하지 않습니다.
그런 다음 인수가 0이 아닌 짝수인지 확인한 후
이 네 개의 평가 문을 본문으로하여 while 루프를 작성하고 각 루프에서 결정된 두 값을 사용하여 case 문을 작성하십시오.
스크립팅의 까다로운 부분은 다음과 같습니다.
#!/bin/sh
# For each pair - this chunk is hard coded for the last pair.
eval TMP="'$'$#"
eval "PICK=$TMP"
eval TMP="'$'$(($#-1))"
eval "OPT=$TMP"
# process as required - usually a case statement on $OPT
echo "$OPT \n $PICK"
# Then decrement the indices (as in third eval statement)
:<< EoF_test
$ ./t.sh -o output -i input -l last
-l
last
$ ./t.sh -o output -l last
-l
last
$ ./t.sh -l last
-l
last
EoF_test