여러 매개변수를 사용하여 다른 스크립트를 실행하는 스크립트를 만들고 싶습니다.
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