115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"
위의 문자열을 구문 분석하고 싶습니다.
내 경우 문자열은 4개의 열( :
각 명령에 대한 구분 기호 포함)로 구성되지만 더 길어질 수도 있습니다. 로 시작하고 , ...항상 구분 기호 없이 115
계속되는 초기 번호를 포함한 모든 명령을 "풀"하고 싶습니다 .wc -l, -iname "*test*"
find /tmp/ -iname "*test*"
:
내 변수는 $var
다음 값을 얻어야 합니다.
var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"
내 코드:
while read line;
do
while [[ $var -ne '0' ]];
do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
echo $var
done
done <$1
파일에서 행을 읽고 열을 빈 열로 잘라낼 때 두 번째 행을 사용합니다. 분명히 뭔가 잘못된 것 같습니다. 에코가 아무 것도 인쇄하지 않기 때문입니다.
답변1
내 생각에 작동한다고 생각하는 방식으로 작동하도록 수정된 스크립트는 다음과 같습니다.
i=1
while read line;
do
while :; do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
[[ "$var" != "" ]] || break
echo $var
done
done <$1
몇 가지 참고사항:
i
초기화되지 않음var
초기화도 없으므로 내부 루프는 한 번도 실행되지 않습니다.- 무엇을 테스트해야 할지 잘 모르겠지만 빈 문자열과 비교하는 것이 더 낫다고
[[ $var -ne '0' ]]
생각합니다 .$var
- 따라서 빈 필드(예: 두 개의 연속 콜론)가 있는 경우 스크립트는 거기서 종료됩니다.
동일한 작업을 수행하는 보다 안정적인 방법은 다음과 같습니다.
while read line; do
num_fields=$(echo $line|awk -F':' '{print NF}')
for (( i=1; i <= num_fields; i++ )); do
var=$( echo $line | cut -d ':' -f$i )
echo $var
done
done <$1