쉘 스크립트 충돌 시 입력 변수 및 파이프 변수

쉘 스크립트 충돌 시 입력 변수 및 파이프 변수

다음 스크립트가 있습니다.

#!/bin/bash
cat $1.txt | awk "{cmd=\"pwgen 10 1\"; cmd | getline pass; print substr($0, 1, length($0) -1) \">> ~/dresses/whole-dresses-shape/$1-\" pass \".jpg\"; close(cmd);}" | bash

명령 내에서 awk "{}"변수 $0는 현재 읽고 있는 행을 참조해야 합니다 cat $1.txt. 그러나 스크립트 파일 내에서 사용될 경우 $0실행 중인 파일 이름의 값이 사용됩니다.

이 예에서 함수가 substr()출력을 얻도록 하려면 어떻게 해야 합니까?cat

필수 작업 흐름:

  • 사용자 입력./myscript.sh hello
  • $1hello귀중한
  • 읽은 각 줄은 cat현재 표시된 내용에 할당됩니다. $0

답변1

다음은 좀 더 깔끔하게 수행할 수 있는 몇 가지 방법입니다( + 문자열 연결 printf대신 in을 사용하는 print것은 개인 취향의 문제입니다. 이 경우에는 더 읽기 쉽습니다).

  1. $1awk 배열 ex의 값을 내보내고 사용합니다 ENVIRON.

    #!/bin/bash
    
    export var="$1"
    
    cat "$1.txt" | awk '
      BEGIN{cmd="pwgen 10 1"} 
      {
        cmd | getline pass; 
        printf "%s >> ~/dresses/whole-dresses-shape/%s-%s.jpg\n", substr($0, 1, length($0) -1), ENVIRON["var"], pass;
        close(cmd);
      }
    '
    
  2. 명령줄 옵션을 사용하여 ex 값을 -v전달합니다 .$1

    #!/bin/bash
    
    cat "$1.txt" | awk -v var="$1" '
      BEGIN{cmd="pwgen 10 1"} 
      {
        cmd | getline pass; 
        printf "%s >> ~/dresses/whole-dresses-shape/%s-%s.jpg\n", substr($0, 1, length($0) -1), var, pass;
        close(cmd);
      }
    '
    

두 가지 모두 외부의 "부드러운" 따옴표를 "하드" 따옴표로 바꿉니다. 부수적인 이점은 보호하려는 경우 참조 레이어를 해제한다는 것입니다.산출토큰화된 문자열(아마도 좋은 습관일 것입니다. 결과를 쉘에 분명히 파이프하고 있기 때문입니다).

printf "\"%s\" >> ~\"/dresses/whole-dresses-shape/%s-%s.jpg\"\n"

-vvs.에 대한 토론을 ENVIRON위해

답변2

이와 같이:

variable="but put shell variable in double quotes"

echo 'Put most of the awk script in single quotes so that $s are not expanded, '"$variable"', then continue in single quotes.'

그러나 프로그램에 코드를 삽입하는 방법에 대한 @Paul_Pedant의 의견을 읽어보세요.

답변3

awk에서는 작은따옴표를 사용합니다. 검증되지 않은

#!/bin/bash
cat $1.txt | awk '{cmd="pwgen 10 1"; cmd | getline pass; print substr($0, 1, length($0) -1) ">> ~/dresses/whole-dresses-shape/'$1'-" pass ".jpg"; close(cmd);}' | bash

관련 정보