사용자 입력을 피연산자로 사용하여 bash에서 Matlab 함수를 호출하는 방법

사용자 입력을 피연산자로 사용하여 bash에서 Matlab 함수를 호출하는 방법

matlab -nodesktop -nosplash -r "functionmat(var1,var2)"명령을 호출 해야 하는 bash를 사용하여 matlab을 실행하고 싶습니다 . 예를 들어 를 실행할 수 있습니다. matlab -nodesktop -nosplash -r "functionmat(5,4)" 이것이 유효한 입력이면 작동하고일부 파일을 생성mfile이러한 작업 중 하나를 수행합니다 .

하지만 변수가 사용자가 요청하는 입력이 되기를 원하므로 사용자가 스크립트를 변경할 필요 없이 실행될 때마다 달라집니다. 사용자는 요청을 받으면 단순히 다른 입력을 입력합니다.

이것은 작동하지 않습니다(아무 일도 일어나지 않습니다):

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2

matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"

이와 같은 호출 matlab도 작동하지 않습니다(숫자가 있어야 하는데 문자열 유형 입력을 읽고 있기 때문에 버그라고 말합니다).

matlab -nodesktop -nosplash -r "functionmat('$var1','$var2')"

이 방법도 작동하지 않습니다(아무 일도 일어나지 않습니다. 파일이 생성되지 않습니다).

sect1="\""
sect2="functionmat("
sect3=","
sect4=")"
sect5="\""

matlab -nodesktop -nosplash -r "$sect1$sect2$var1$sect3$var2$sect4$sect5"

누구든지 작동시키는 방법을 알고 있습니까?

답변1

첫 번째 제안은 제대로 작동할 것입니다. 유일한 변형은 변수를 올바르게 입력했는지 확인하는 것입니다(쉼표가 아닌 공백으로 구분). 코드를 약간 수정하여 두 변수의 값을 인쇄하고 명령을 실행하는 대신 명령을 인쇄하면 matlab코드가 정확하다는 것을 증명할 수 있습니다.

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2
echo "var1=$var1, var2=$var2."
echo matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"

답변2

첫 번째 접근 방식은 거의 정확합니다. 변수가 실제로 합법적인 Matlab 구문인지 확인하기만 하면 됩니다. 두 번째 것은 Matlab에서 입력이 func('1','5')매개변수로 문자열처럼 보이기 때문에 잘못된 것입니다. 세 번째 줄은 "func(1,5)"단지 문자열 리터럴이기 때문에 아무 작업도 수행하지 않습니다. 무엇을 전달하고 있는지 보려면 matlab로 바꾸세요 .printf '%s\n'

입력 검증

사용declare -i var1 var2변수가 다음과 같이 인식되도록 합니다.정수, 그리고 할당되면 bash는 평가 결과를 string-to-assignC 스타일 표현식으로 지정합니다(그리고 표현식 구문 오류에 대해 불평합니다). 이렇게 하세요:

  • 3*2(쉘에서 평가됨 )과 같은 6표현식을 사용할 수 있습니다 .
  • 와 같은 것을 사용하는 것은 허용되지 않습니다 2.45.
  • 전달된 숫자가 정수인지 확인하세요.
    • 다음과 같은 구조체는 [[:alpha:]_][[:word:]]*varname으로 인식되며 추가로 평가되며 정의되지 않은 경우 기본값은 0입니다.

오류가 발생하면 read전체 변수가 여전히 초기화되지 않습니다. 다음과 같이 캡처할 수 있습니다.

declare -i var1 var2
until ((${#var1[@]} && ${#var2[@]})); do read -p "INPUT! NOW!" var1 var2; done

사용자 정의 확장 와일드카드 모드처리하고 싶다면 사용할 수 있습니다소수점그렇습니다. (변수 처리 부분은 제외됩니다.) 표현에 대해 생각하기에는 너무 게으르다는 점에 유의하십시오.

shopt -s extglob # bash 3, regex =~ is bash 4.
until [[ $var1 == +([0-9])?(.*([0-9])) && $var2 == +([0-9])?(.*([0-9])) ]]; do
    read -p "Please input.. " var1 var2
done

한 단계 더 나아가 사용하려는 일부 MATLAB 변수를 허용할 수도 있습니다. 이렇게 하면 원시 문자열로 전달되기 때문입니다.

read분할기

IFS+=,유효한 구분 기호로 사용하기 원하는 항목 또는 그 이전에 추가하기 만 하면 됩니다 read.


이 답변은 위의 두 답변에 추가되거나 아마도 조합된 것입니다. 편집된 것으로 밝혀졌습니다113859그리고113860. 읽다GNU 배쉬 매뉴얼자세한 내용은 3.5.3장(초기화 검사), 3.5.7장(IFS), 3.5.8.1장(모드) 및 4.2장(내장: 선언)을 참조하세요.

내 컴퓨터에 Matlab이 없기 때문에 GNU Octave를 사용하여 구문 검사의 효율성을 확인합니다. 구문을 시험해보고 싶은 사람을 위한 온라인 Octave 서비스도 있습니다.

답변3

입력하지 않으면 Bash 변수는 문자열로 처리됩니다. 먼저 변수 유형을 선언해 보겠습니다. 이런 것들,

declare -i var1

이 유형 선언이 해결책을 제공할 것이라고 낙관하지는 않지만 시도해 볼 가치가 있습니다.

그래도 작동하지 않으면 함수의 인수를 숫자 값 대신 문자열로 변경하는 것은 어떨까요? mfile이 선택한 숫자 유형으로의 변환을 처리하도록 하십시오.

인용하다:

답변4

알겠습니다. 프로그램을 실행하는 방법을 찾았습니다.

  #!/bin/bash

    echo "Please enter variables 1 and 2:"
    read var1 var2

    declare -i var1
    declare -i var2

    mystring="matlab -nodesktop -nosplash -r \"functionmat($var1,$var2);exit\""
    eval $mystring

답변해주시면 도움주셔서 감사합니다

관련 정보