나는 조금 붙어 있습니다. 내 임무는 세 번째와 네 번째를 제외하고 스크립트의 인수를 역순으로 인쇄하는 것입니다.
내가 가진 것은 다음 코드입니다.
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
나는 eval(PHP에 대한 모자 팁)을 싫어하기 때문에 그것이 없는 솔루션을 찾고 있지만 찾을 수 없습니다.
매개변수의 위치를 동적으로 정의하는 방법은 무엇입니까?
추신: 아니요, 이것은 과제가 아닙니다. 저는 시험을 위해 쉘을 배우고 있어서 오래된 시험을 해결하려고 합니다.
답변1
eval
동적으로 선택된 위치를 통해 위치 매개변수에 액세스하는 유일한 이식 가능한 방법입니다. (사용하지 않는) 값 대신 인덱스를 명시적으로 반복하면 스크립트가 더 깔끔해집니다. expr
스크립트를 골동품 Bourne 쉘에서 실행하려는 경우가 아니면 연산 $((…))
은 POSIX에 있습니다. 사용을 eval
가능한 한 가장 작은 조각으로 제한하십시오. 예를 들어 사용하지 말고 eval echo
임시 변수에 값을 할당하십시오.
i=$#
while [ "$i" -gt 0 ]; do
if [ "$i" -ne 3 ] && [ "$i" -ne 2 ]; then
eval "value=\${$i}"
echo "Parameter $i is $value"
fi
i=$((i-1))
done
Bash에서는 를 사용하여 ${!i}
이름이 지정된 매개변수의 값을 나타낼 수 있습니다 $i
. 이 방법 $i
은 명명된 인수 또는 숫자(위치 인수를 나타냄)일 때 작동합니다. 사용하시면 다른 bash 편의 기능도 활용하실 수 있습니다.
for ((i=$#; i>0; i--)); do
if ((i != 3 && i != 4)); then
echo "Parameter $i is ${!i}"
fi
done
답변2
reverse
나는 다음과 같은 작업을 수행하는 스크립트를 경로에 유지합니다.
#!/bin/sh
if [ "$#" -gt 0 ]; then
arg=$1
shift
reverse "$@"
printf '%s\n' "$arg"
fi
사용 예:
$ reverse a b c '*' '-n'
-n
*
c
b
a
전용 스크립트 대신 기능을 사용할 수도 있습니다.
답변3
위치 매개변수에 개행 문자가 포함되어 있지 않다고 가정합니다.
[ "$#" -gt 0 ] && printf '%s\n' "$@" | #print in order
sed '3,4 d' | #skip 3 and 4
tac #reverse (try tail -r on
#non-GNU systems).
시험:
set 1 2 3 4 5 6
printf '%s\n' "$@" |
sed '3,4 d' |
tac
테스트 출력:
6
5
2
1
답변4
그리고 zsh
:
$ set a 'foo bar' c '' '*'
$ printf '<%s>\n' "${(Oa)@}"
<*>
<>
<c>
<foo bar>
<a>
Oa
확장 시 배열 요소를 정렬하는 데 사용되는 매개변수 확장 플래그입니다.취소배열 인덱스.
3과 4 제외:
$ printf '<%s>\n' "${(Oa)@[5,-1]}" "${(Oa)@[1,2]}"
<*>
<foo bar>
<a>