어떤 쉘이라도 소수점이 있는 문자열을 숫자(int, float)로 해석할 수 있습니까?

어떤 쉘이라도 소수점이 있는 문자열을 숫자(int, float)로 해석할 수 있습니까?

이 아이디어는 최근 Visual Studio Code를 업데이트하는 동안 나에게 나타났습니다. 여기서는 일반적으로 코드를 자동으로 셸 검사하기도 합니다. 이게 나야바라보다, 그러면 다음과 같은 아이디어를 얻을 수 있습니다.

여기에 이미지 설명을 입력하세요.

많은 쉘에서 테스트할 수 있는 사람들에게 이 질문은 정말 간단합니다. 저는 Bash와 Dash만 설치했습니다.

어떤 쉘이라도 소수점이 있는 문자열을 숫자(int, float)로 해석할 수 있습니까?

시간 내 주셔서 감사합니다.

답변1

var=value

주요 Unix 셸 계열만 살펴보면 Bourne과 같은 셸에서 스칼라 변수 할당, rc와 같은 셸에서 변수 할당(모든 변수는 목록이며 여기서는 값이 하나만 있는 목록), fish 및 var=valuecsh와 유사한 셸에서 명령을 실행합니다 (자세한 내용은쉘 스크립트에서 변수 할당의 공백).

이러한 할당의 경우 변수 값을 숫자로 처리하려면 숫자 또는 산술 표현식이 예상되는 컨텍스트에서 이를 사용해야 합니다 $var(또는 Korn과 같은 쉘에서 수행하는 경우도 있음).var

예를 들어 (모든 쉘에 모두 적용되는 것은 아님)

arr[var]=foo
printf '%g\n' "$var"
printf '%d\n' var
(( var++ ))
echo "$(( var ))"
[[ var -gt 2 ]]
shift var
echo "$var + 1" | bc
export var; awk '{print ENVIRON["var"] + 1}'

ksh, bash및 를 포함한 Korn과 같은 쉘에서 zsh변수가 typeset -i var, 또는 동일한 -E, -F또는 -X, 또는 또는 (bash/pdksh에는 부동 소수점 변수가 없음) 로 integer var선언 된 경우 할당 시 숫자로 해석됩니다.float var

192.168.0.40그러나 모든 기본 또는 로케일에서 유효한 정수 또는 부동 소수점 숫자가 아닙니다. 192.168은 다양한 상황에서 유효한 부동 소수점 숫자이며, 천 단위 구분 기호가 인 로케일에서는 유효한 정수일 수 있습니다 ..

192.168.123.123192168123123(각 그룹은 첫 번째 숫자를 제외하고 항상 3자리입니다.) 이는 천 단위 구분 기호와 동일한 로케일이므로 .숫자를 예상하고 로케일 천 단위 구분 기호를 허용하는 컨텍스트에서 허용됩니다.

ksh93의 산술 표현식이 그런 경우라는 것만 알고 있습니다. 예를 들어:

$ LC_ALL=it_IT.UTF-8 var=192.168.123.123 ksh93 -c 'printf "%e\n" var'
1,921681e+11
$ LC_ALL=it_IT.UTF-8 ksh93 -c 'echo "$((192.168.123.123 * 2))"'
384336246246
$ LC_ALL=it_IT.UTF-8 ksh -c 'integer var; var=192.168.123.123; echo "$var"'
192168123123

이탈리아어 로케일에서 쉼표는 소수 기수 문자이고 마침표는 천 단위 구분 기호입니다.

그러나 어쨌든 위의 모든 경우처럼 변수의 내용을 숫자로 해석하도록 명시적으로 요청하지 않는 한 숫자로 해석되지 않습니다. 해당 편집기의 구문 강조 표시는 다음과 같습니다. 오해의 소지가 있습니다. 쉘은 주로 문자열 인수 목록인 명령을 위한 실행 도구이므로 기본적으로 쉘 변수에는 일반적으로 문자열 또는 문자열 목록만 포함되며 쉘에서 실행되는 명령은 이러한 문자열을 숫자, 파일 이름, 사용자 이름, IP 주소 또는 원하는 모든 것.


execve()1 시스템 호출을 통해 실행되는 시퀀스의 경우 두 번째 argv[]인수가 C(NUL로 구분된) 문자열에 대한 포인터 배열이기 때문에 0 외에 0개 이상의 바이트로 구성된 시퀀스가 ​​있습니다 .

답변2

Bash와 Dash만 설치했습니다.

주어진 컨텍스트에 따라 이러한 변수에 유형이 할당되어 있는지 여부를 확인할 수는 없지만 다음과 같습니다.

bash-5.2$ declare -i n
bash-5.2$ n=192.168.0.40
bash: 192.168.0.40: syntax error: invalid arithmetic operator (error token is ".168.0.40")

관련 정보