명령 매개변수($1, $2)를 정수로 변경하는 방법은 무엇입니까?

명령 매개변수($1, $2)를 정수로 변경하는 방법은 무엇입니까?

$1 $2명령줄( )에서 스크립트의 여러 매개변수를 가져옵니다.

입력되는 값이 쓰레기가 아닌지 확인하기 위해 테스트해 보았습니다.

if [ $1 ]; then
    INPUT=$1
if [[ -n ${INPUT//[0-9]/} ]]; then

즉, 비어 있지 않고 0-9(숫자)로 구성되어 있는지 확인하려고 합니다. $1즉 누군가 입력이 없거나 script string more_strings간단하고 매개 변수가 없는 script것과 같은 것 대신에script 12 321

그런 다음 $INPUT(저는 $1도 시도했습니다)를 정수로 처리해 보십시오.

if [ $INPUT -gt 100 ]; then
    INPUT=100
fi

실패했습니다. 에코 테스트에서 문자열이 있는 것 같습니다(gt를 사용하고 있음에도 불구하고 - 정수로 평가한다는 의미라고 가정합니까?). $1을 정수로 가져오거나 평가하는 방법을 잘 모르겠습니다. ?

http://mywiki.wooledge.org/BashFAQ/054

나는 이렇게 하라고 조언받았습니다:

if [[ $1 != *[!0-9]* ]]; then

그러나 나는 거기에서 무슨 일이 일어나고 있는지 이해하지 못합니다. 0-9가 아닌 것과 같지 않나요? ? ? 왜*?

재미있어 보이네요:

declare -i $1

그런데 $1이 영구적으로 변경된 것 같나요? 재배치까지?

입력이 A) 문자열인지 B) 숫자/정수인지 확인하기 위해 입력을 테스트하는 방법과 이를 스크립트에서 사용하는 방법(또는 변환 방법)을 알고 싶습니다. 설명을 듣는 것이 가장 좋습니다.

이전 질문에 대해 몇 가지 검색을 시도했지만 잘못된 용어를 검색한 것 같습니다. 이는 수행 방법을 잊어버렸거나 다른 곳에서 답변했어야 하는 매우 기본적인 것 같기 때문입니다.

여기에서도 찾을 수 없습니다:

https://ss64.com/bash/test.html

어쩌면 취침 시간이 필요할 수도 있습니다.

답변1

에서 연산자는 실제로 패턴 일치이므로 테스트 중인 값이 패턴과 일치하지 [[ .. ]]않습니다 .=[[ $1 != *[!0-9]* ]]$1*[!0-9]*

여기에 사용된 패턴은 파일 이름 확장과 동일하므로 *모든 문자, [abc]대괄호 사이의 문자 및 [!abc]/또는 [^abc]모든 문자 와 일치합니다.아니요괄호 사이(선행 !또는 제외 ^). 기본적으로 의 숫자가 아닌 $1일부 문자가 포함되어 있는지 테스트합니다 .09


declare -i var변수를 var정수 변수로 표시합니다. 이에 대한 할당은 산술 컨텍스트에서처럼 해석되어 declare -i a; a=3+5; echo $a;출력됩니다 8. 하지만 위치 인수(예: )에는 사용할 수 없습니다 $1. 대신 declare -i $1에 포함된 문자열을 가져와 $1사용합니다 .저것변수 이름으로. ( $위에 내용은 없습니다 declare -i a.)

declare -i산술 문맥의 문자열은 변수로 취급되기 때문에 무언가가 숫자인지 테스트하는 데 실제로 사용할 수는 없습니다 .이름. 이것은 오류가 아닙니다: declare -i a; b=1+2; a=b; echo $a;. 대신에 인쇄하는데 3, 이는 원하는 것일 수도 있고 아닐 수도 있습니다.

답변2

입력이 있는지 확인하고 숫자(1자리 이상)인지 확인하려면 다음을 사용했습니다.전반적인 상황:

if [ $2 ]; then INPUT=$2 if [[ $INPUT = +([[:digit:]]) ]]; then

숫자가 아닌 입력을 테스트하는 것 같습니다.

if [[ -n ${INPUT//[0-9]/} ]]; then

답변3

일까츄처럼 좋은 설명이 없네

하지만 이 방법을 시도해 볼 수는 있습니다

[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"

관련 정보