`ash`에서 n번째(색인화된) 위치 인수 값을 검색하는 더 좋은 방법은 `eval echo \$$n`입니다.

`ash`에서 n번째(색인화된) 위치 인수 값을 검색하는 더 좋은 방법은 `eval echo \$$n`입니다.

select사용자가 환경 의 화면에 있는 번호 목록에서 파일을 가져오길 원합니다 mkinitcpio busybox ash. 목록은 위에서 아래로 채우거나 정렬하고 열로 인쇄해야 합니다. 예를 들면 다음과 같습니다.

1) 2017-12-17   3) 2017-12-19   5) 2017-12-21   7) 2017-12-23  9) 2017-12-25
2) 2017-12-18   4) 2017-12-20   6) 2017-12-22   8) 2017-12-24

한 줄씩 화면에 인쇄하고 있습니다 printf. 그래서 일반적으로 배열을 사용합니다. busybox ash배열 지원이 부족하기 때문에 위치 인수( 등)를 사용하여 set가난한 사람의 배열을 만드는 것이 해킹입니다.$1=2017-12-17$2=2017-12-18

이제 다음을 사용하여 위치 매개변수 값을 검색합니다.

file=$(eval echo \$$i)

검색하는 더 좋은 방법이 있나요?n번째 위치 매개변수존재하다금연 건강 증진 협회?


노트

  1. 위에 나열된 열은 단순화된 예입니다. 실제 파일 이름에는 타임스탬프도 포함됩니다(예: 2017-12-27-060056.
  2. Mkinitcpio busybox 1.27.2 컴파일 구성.

답변1

사용:

eval "file=\${$i}"

명령 대체는 필요하지 않습니다. 후행 줄 바꿈을 제거하는 동안 데이터가 손상되고, 포크() 및 파이프라인()이 포함되고 해당 파이프를 통해 두 프로세스 간에 데이터를 푸시하므로 비효율적입니다.

echo또한 임의의 데이터에 적용해서도 안 됩니다.

또한 9보다 큰 숫자에 대해 POSIX sh 구문에 필요한 중괄호에 유의하세요.

$i사용자로부터 읽는 경우 명령 주입 취약점을 방지하기 위해 앞에 s 또는 s가 $#없이 1부터 1까지의 십진 정수인지 확인하는 것이 좋습니다.0+

valid() { # args: string min max
  case $1 in
    (*[!0123456789]* | 0* | "" | ??????????*) return 1
  esac
  [ "$1" -ge "$2" ] && [ "$1" -le "$3" ] 
}

until
  printf>&2 'Enter number: '
  IFS= read -r number
  valid "$number" 1 "$#"
do
  echo>&2 "Not a valid number. Please try again."
done
eval "file=\${$number}"

답변2

패닝을 사용할 수 있습니다. 평가보다 이게 더 낫네요.

고양이는 바빠요.sh

leshift () {
  shift "$1"
  echo "$1"
}
echo param debut
echo $#
echo $@
for i in "$@" ; do
  echo "$i"
done

echo param shift
read a # number from 1 to 5
b=$(leshift "$a" "$@")
echo $b

echo param fin
echo $#
echo $@
for i in "$@" ; do
  echo "$i"
done

넌 그냥 그렇게 부르잖아

./busy.sh a b 'c h' d e

관련 정보