변수에 명령줄 매개변수 문자열을 작성한 다음 이를 사용하여 명령을 실행하고 싶습니다. 아래에 간단한 예를 보여 드렸습니다. 이것은 "listfiles"라는 스크립트입니다. 파일을 나열하지 않고 "ignore"라는 파일을 읽은 다음 해당 파일을 제외한 모든 파일을 나열해야 합니다. 내가 하고 싶은 일을 성취하는 가장 좋은 방법은 무엇입니까?
ignorelist=( `cat "./ignore" `)
for LINE in "${ignorelist[@]}"
do
Ignore="$Ignore -path '$LINE' -prune -o ";
done
find ${Ignore} -print
파일 내용(디렉터리 이름 2개)을 무시합니다.
./d1
./d2
bash -x 목록 파일의 출력:
+ ignorelist=(`cat "./ignore" `)
++ cat ./ignore
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o '
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o -path '\''./d2'\'' -prune -o '
+ find -path ''\''./d1'\''' -prune -o -path ''\''./d2'\''' -prune -o -print
.
./1
./2
./3
./d1
./d1/4
./d1/d1a
./d1/d1a/5
./d2
./ignore
./listfiles
d1과 d2 및 아래의 모든 내용이 출력에 포함되지 않도록 하거나 무시 파일의 모든 파일/디렉터리가 출력에 포함되지 않기를 원합니다. 전체 명령을 var에 저장하고 평가하는 것이 더 낫습니까?
답변1
항상 배열을 사용하여 다음을 저장하십시오.분리. 빌드에 유효한 옵션 세트가 있는지 확인하십시오 find
. 매개변수에 추가 따옴표를 포함하지 마십시오. 이로 인해 결국 명령이 실패하게 됩니다.
#!/bin/bash
readarray -t ignorepaths <./ignore
ignoreopts=()
for pathname in "${ignorepaths[@]}"; do
ignoreopts+=( -o -path "$pathname" )
done
find . \( "${ignoreopts[@]:1}" \) -prune -o -print
당신은 또한 볼 수 있습니다
- 쉘 변수를 명령 옵션으로 사용 ...다른 사람.
을 위한 /bin/sh
:
#!/bin/sh
set --
while IFS= read -r pathname; do
set -- "$@" -o -path "$pathname"
done <./ignore
shift
find . \( "$@" \) -prune -o -print