다음 스크립트가 있습니다.
#!/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
$1
hello
귀중한- 읽은 각 줄은
cat
현재 표시된 내용에 할당됩니다.$0
답변1
다음은 좀 더 깔끔하게 수행할 수 있는 몇 가지 방법입니다( + 문자열 연결 printf
대신 in을 사용하는 print
것은 개인 취향의 문제입니다. 이 경우에는 더 읽기 쉽습니다).
$1
awk 배열 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); } '
명령줄 옵션을 사용하여 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"
-v
vs.에 대한 토론을 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