스크립트에서 bash 실행

스크립트에서 bash 실행

여러 매개변수를 사용하여 다른 스크립트를 실행하는 스크립트를 만들고 싶습니다.

exp=([1]=bloc [2]=ins [3]=rep [4]=op)
for j in ${!exp[*]}
do
    arr=([1]=mem [2]=gen [3]=usr)
    for i in ${!arr[*]}
    do
    var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0" ${arr[i]} ${exp[j]}
    $var
    done
done

이 오류가 있습니다.

run.sh: line 9: =bash createGnuploat.sh op ../Result/ 0: Aucun fichier ou dossier de ce type

무슨 문제라도 있습니까?

답변1

이 줄에는 여러 구문 및 인용 문제가 있습니다.

$var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0" ${arr[i]} ${exp[j]}

귀하의 질문에 대한 더 깨끗한 버전의 스크립트는 다음과 같습니다.

for j in bloc ins rep op; do
        for i in mem gen usr; do
                bash createGnuploat.sh "$j" ../Result/ 0 "$i" "$j"
        done
done

이런 논쟁의 목적이 무엇인지는 모르므 createGnuploat.sh로 직접 확인해 보아야 할 것이다.

답변2

명령을 변수에 저장해야 하는 경우 문자열을 사용하지 마십시오. 문자열은 작동하지 않습니다. 바라보다배쉬 FAQ #50. 함수나 배열을 사용하세요.

var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0"귀하의 행은 두 단어 ${arr[i]}(명령 이름으로 처리됨)와 ${exp[j]}(명령에 대한 첫 번째이자 유일한 인수가 됨) 가 뒤에 오는 할당으로 구문 분석됩니다 . 질문이나 편집기에서 구문 강조를 확인하면 인용된 문자열 안에 무엇이 있는지 표시됩니다.

변수 대체에는 항상 큰따옴표를 사용하십시오 "$foo". 예를 들어 그렇지 않으면 변수 값이 전역 패턴으로 해석되는 단어로 분할됩니다. (0.01%의 경우 이것이 원하는 동작입니다. 큰따옴표를 생략하십시오.) 배열의 경우, 사용은 "${foo[@]}"배열의 각 요소를 별도의 단어에 넣습니다( "${foo[*]}"단어인 경우 배열의 요소는 공백으로 구분됩니다. 생략하는 경우 따옴표로 묶고 각 요소는 별도의 단어로 구분되어 전역 패턴으로 해석됩니다.

다음은 함수를 사용하여 다시 작성된 코드 조각입니다.

create_plot () {
  bash createGnuploat.sh "${exp[$2]}" ../Result/ 0 "${arr[$1]}" "${exp[$2]}"
}

for j in "${!exp[@]}"
do
    arr=([1]=mem [2]=gen [3]=usr)
    for i in "${!arr[@]}"
    do
      create_plot "$i" "$j"
    done
done

함수 대신 배열 변수를 사용하는 것이 더 적합한 드문 경우:

for j in "${!exp[@]}"
do
    arr=([1]=mem [2]=gen [3]=usr)
    for i in "${!arr[@]}"
    do
      var=(bash createGnuploat.sh "${exp[j]}" ../Result/ 0 "${arr[i]}" "${exp[j]}")
      "${var[@]}"
    done
done

관련 정보