파이프 출력을 쉘 스크립트 인수로 사용할 수 있습니까?


22

Myscript.sh입력으로 하나의 인수가 필요한 bash 쉘 스크립트가 있다고 가정하십시오 .

그러나 나는 텍스트 파일의 내용 text.txt이 그 인수가 되기를 원합니다 .

나는 이것을 시도했지만 작동하지 않습니다 :

cat text.txt | ./Myscript.sh

이것을 할 수있는 방법이 있습니까?

답변:



19

파이프 출력을 쉘 스크립트 인수로 사용할 수 있습니다.

이 방법을 시도하십시오 :

cat text.txt | xargs -I {} ./Myscript.sh {}

2

파일에 둘 이상의 명령이있는 경우 xargs 또는 parallel 사용을 고려하십시오 ( 예 :

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

0

시험,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

그래서 당신은 하나에 의해 값 하나를 입력 할 수 있습니다 comli.sh에서 comli.txt.



0

mapfile로 stdin을 읽으면 위치 매개 변수를 재설정 할 수 있습니다.

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

( "$ @"를 인용하면 for대신 루프 라인 이 만들어집니다 ).

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

@ bac0n을 완성하기 위해 IMHO가 질문에 올바르게 대답하는 유일한 방법은 다음과 같습니다. 파이프 인수를 스크립트 인수 목록 앞에 추가하는 짧은 라이너가 있습니다.

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

사용 예 :

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.