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번째 위치 매개변수존재하다금연 건강 증진 협회?
노트
- 위에 나열된 열은 단순화된 예입니다. 실제 파일 이름에는 타임스탬프도 포함됩니다(예:
2017-12-27-060056
. - 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