안녕하세요 스크립트를 배우러 왔습니다. "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
과 같은 셸을 사용하면 구문은 다음과 같습니다.bash
zsh
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 연산자(!)를 호출합니다. 수리).