이 작업을 수행하는 데 약간 어려움을 겪고 있습니다. 예를 들어 for 루프를 사용하여 변수 값을 파일에 보내는 간단한 루프를 만들 수 있습니까? 하지만 변수 값을 출력하기 전에 뭔가를 얻는 방법은 무엇입니까? 해결 방법으로 다음과 같은 작업을 수행했습니다.
list="$1\n$2\n$3"
varNames=$'var1=\nvar2=\nvar3='
for i in $varNames $list; do
echo -e $varNames$list > "vars-$(date +%Y-%m-%d_%H.%M).file"
done
그러나 두 목록의 각 항목을 올바르게 반복하는 루프를 얻을 수는 없지만 결과는 다음과 같습니다.
var1= var2= var3=$1
$2
$3
위에 보이는 $1,$2,$3는 제가 앞서 생성한 변수들의 정확한 값입니다. 이 루프에서 내가 무엇을 놓치고 있나요? 두 개의 목록을 만드는 것이 좋은 접근 방식입니까, 아니면 나중에 일부 sed에서 처리할 수 있습니까?
감사합니다!
답변1
스크립트에는 거의 스크립트의 줄 수만큼 많은 문제가 있으며, 각 단계에서 다른 모든 것이 예상대로 작동한다고 가정하고 문제를 하나씩 해결하려고 노력합니다.
1.
list="$1\n$2\n$3"
\n
줄 바꿈이 대체되지 않기 때문에 작동하지 않습니다 . 다음과 같은 것이 필요합니다.
list="$1"$'\n'"$2"$'\n'"$3"
또는
list="$1
$2
$3"
2.
for i in $varNames $list; do
(1)을 수정한다고 가정하면 루프는 6번 실행됩니다(면책조항, 마지막 문장 참조). $varNames
그리고 각각 한 번 $list
, 의도한 것은 아니라고 생각합니다. 또한 이렇게 반복하면 변수가 줄 바꿈으로 구분되지 않고 다음과 같이 구분됩니다.$IFS
. 기본값은 개행, 공백 또는 탭입니다. 따라서 유효하지만 이것을 알면 list="$1 $2 $3"
(1)에서 사용할 수도 있습니다. 물론 이는 각 변수에 개행, 공백 또는 탭이 포함되어 있지 않다는 것을 알고 있는 경우에만 작동합니다.
삼.
echo -e $varNames$list
분할된 부분뿐만 아니라 전체 변수를 출력합니다 $i
.
4.
반복할 때마다 전체 파일을 덮어씁니다. 더 나은 사용
for ...; do ... done > file
그럼 이제 어떡하지?
코드를 있는 그대로 쉽게 고칠 수는 없다고 생각합니다. 대신 bash 배열을 사용하고 키를 반복해야 합니다.
#!/bin/bash
list=("$1" "$2" "$3")
varNames=("var1" "var2" "var3")
for k in "${!varNames[@]}"; do
printf '%s=%s\n' "${varNames[$k]}" "${list[$k]}"
done > "vars-$(date +%Y-%m-%d_%H.%M).file"
나는 printf
(이것 좀 봐echo
) 하지만 상관없으시면 이렇게 사용해도 됩니다...
echo "${varNames[$k]}=${list[$k]}"