다른 명령의 출력인 변수를 반복합니다.

다른 명령의 출력인 변수를 반복합니다.

안녕하세요 스크립트를 배우러 왔습니다. "for" 루프를 사용하여 간단한 스크립트를 작성하려고 합니다.

user라는 폴더에 수백 개의 폴더가 있습니다.
이 명령을 실행하면 다른 폴더로 이동해야 하는 폴더 목록이 표시됩니다.

cat failed | awk -F ":" '/FAILED/ {print $1}' |  uniq

즉, 작업이 실패한 사용자 아래의 폴더를 users/failed/failedusers로 이동해야 합니다.

현재 내가하고있는 일은 먼저 다음을 사용하여 새 파일을 만드는 것입니다.

cat failed | awk -F ":" '/FAILED/ {print $1}' |  uniq > failedusers

그런 다음 다음 명령을 사용하여 폴더를 이동했습니다.

while read line; do cp -r users/$line users/failed; done < failedusers

내 질문은 그냥 사용할 수 있습니까?~을 위한출력을 다른 파일에 쓰고 다음을 사용하는 대신 명령읽는 동안완료하라는 명령이요?

예를 들어 다음과 같은 방식으로 루프의 변수에 값을 할당합니다.

faileduser=`cat failed | awk -F ":" '/FAILED/ {print $1}' |  uniq`

그런 다음 다음과 같이 작성하십시오.

mv users/$faileduser user/failed/$faileduser

위와 같은 내용을 작성하려고 하면 다양한 오류가 발생합니다.

감사해요

답변1

GNU xargs와 ksh 스타일 프로세스 교체를 지원하는 셸을 사용하면 다음을 수행할 수 있습니다.

xargs -rd '\n' -I USER -a <(awk -F : '/FAILED/ {print $1}' failed | sort -u
  ) cp -r users/USER user/failed/USER

이를 통해 zsh다음을 수행할 수 있습니다.

faileduser=( ${(f)"$(awk -F : '/FAILED/ {print $1}' failed | sort -u)"} )
autoload zargs
zargs -rI USER -- $faileduser -- cp -r users/USER user/failed/USER

복사하고 싶다고 가정 해 봅시다USER 도착하다 user/failed/USER, 즉 복사하세요.입력하다 user/failed, 다음을 수행할 수도 있습니다(여전히 사용됨 zsh).

(( $#faileduser )) && cp -r users/$^faileduser user/failed/

bash쉘을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

readarray -t faileduser < <(awk -F : '/FAILED/ {print $1}' failed | sort -u)
(( ${#faileduser[@]} )) &&
  cp -r "${faileduser[@]/#/user\/}" user/failed/

또는 모든 사용자 이름 앞에 awk다음을 추가하세요 .user/

readarray -t faileduser < <(awk -F : '/FAILED/ {print "user/"$1}' failed | sort -u)
(( ${#faileduser[@]} )) &&
  cp -r "${faileduser[@]}" user/failed/

루프 의 경우 Korn(포함 , 와 함께 사용할 수도 있음 ) for과 같은 셸을 사용하면 구문은 다음과 같습니다.bashzsh

for user in "${faileduser[@]}"; do
  cp -r "user/$user" "user/failed/$user"
done

다음 zsh과 같이 단축할 수 있습니다.

for user ($faileduser) cp -r user/$user user/failed/$user

그리고:

faileduser=`cat failed | awk -F ":" '/FAILED/ {print $1}' |  uniq`

( `...`는 더 이상 사용되지 않으며 더 이상 사용되지 않는 명령 대체 형식입니다. 을 사용하십시오 $(...).)

awk출력을 다음 위치에 저장합니다 .스칼라, 배열 변수가 아닙니다.

위의 명령 대체에서 직접 수행한 것처럼 zsh인수 확장 플래그를 사용하여 개행 문자로 분할할 수 있습니다 .f

array=( ${(f)faileduser} )

Bash(또는 ksh)에서는 glob을 비활성화하고 분할을 조정한 후 분할+glob 연산자를 사용할 수 있습니다.

set -o noglob
IFS=$'\n'
array=( $faileduser )

(예, bash인용되지 않은 인수 확장은 Bourne 쉘에서 상속된 버그 기능이며 zsh 및 Bourne과 유사한 최신 쉘이 아닌 대부분의 쉘에 존재하는 암시적 분할+glob 연산자(!)를 호출합니다. 수리).

관련 정보