대시 스크립트 교체 배열

대시 스크립트 교체 배열

이 스크립트는 Debian 11(bullseye)에서 bash를 사용하면 작동합니다. 하지만 이제는 데비안의 sh쉘( )을 사용하도록 리팩토링해야 합니다 /bin/dash.

#!/bin/dash

var1=1
var2=2
var3=3

arr=($var1 $var2 $var3)
exist_var="${arr[*]:+ message}"
echo $exist_var

이제 변수가 설정되면 메시지가 표시됩니다.

tuy@debian$ bash sh_array.sh 
message

변수가 설정되지 않으면 어떤 메시지도 표시되지 않습니다.

tuy@debian$ bash sh_array.sh 
$

대시는 배열을 지원하지 않는다는 것을 알고 있습니다. 변수가 정의된 경우 스크립트는 메시지를 인쇄해야 합니다. 변수가 정의되지 않은 경우 스크립트는 계속 작동하지만 메시지를 인쇄하지 않습니다.

답변1

dash, bash 또는 기타 POSIX 쉘에서 또는 변수 var1중 하나 이상 이 (빈 문자열을 포함한 임의의 값으로) 설정되어 있는지 확인하려면 다음을 수행하십시오.var2var3

if [ -n "${var1++}${var2++}${var3++}" ]; then
  echo At least one of those 3 are set
fi

또는

set=${var1++}${var2++}${var3++}
echo "${#set} out of 3 of those variables are set"

Bash에서도 귀하의 코드는 의미가 없습니다.

* 배열 요소와 그 사이의 첫 번째 문자의 연결이 빈 문자열이 아닌 경우 "${arr[*]:+ message}"확장됩니다 ." message"arr$IFS

이전에는 , 및 arr에 적용할 분할+glob을 정의했습니다 .$var1$var2$var3

기본값을 사용하면 $IFS이러한 변수가 모두 설정되었지만 공백, 탭 또는 줄바꿈만 포함된 경우 arr분할 섹션으로 인해 배열에 요소가 없게 됩니다. var1예를 들어, 로 설정하면 /*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*glob 부분으로 인해 arr컴퓨터 충돌 없이 배열에 수백만 개의 요소가 포함됩니다.

관련 정보