인수에 별표가 있는 프로그램을 호출하는 Bash 스크립트

인수에 별표가 있는 프로그램을 호출하는 Bash 스크립트

나는 지난 한 시간 동안 꽤 간단한 bash 스크립트를 작성하려고 노력했지만 그렇게 멍청하다고 느낀 적은 없었습니다.

따라서 별표가 포함될 수 있는 문자열 목록(중요한 경우 패키지 관리자를 위한 패키지 선택기 사양)이 있습니다. 별표를 유지하는 명령줄을 작성한 다음 프로그램을 호출해야 합니다. 내 순진한 시도는 다음과 같습니다.

xs="foo/bar */*"

xs_cmd=""
for x in $xs; do
  xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd

echo다음과 같은 호출이 필요합니다 .

echo   -0 foo/bar    -0 '*/*' 

이는 -0 foo/bar -0 */*.

PS 실제로 첫 번째 줄은 약간 더 복잡합니다. xs="$some foo/bar */* $(get_others)".


가 포함된 디렉토리에서 이 스크립트를 실행하면 대신에 a/b가 표시됩니다 -0 foo/bar -0 a/b.

마지막 줄을 다음으로 변경하면

echo "$xs_cmd"  # note the quotes

나는 그것을 얻었고 -0 foo/bar -0 a/b 우선 그것은 내가 원하는 것이 아닙니다. 지금 echo하나의그리고 더 나아가 확장이 루프에서 더 일찍 일어나고 있음을 알려줍니다 for.

하지만 줄을 바꿀 수는 없어요 for. 왜냐하면

for x in "$xs"; do  # note the quotes

루프를 한 번만 반복하게 됩니다. -0 foo/bar */*(단일 가 있음 -0) 따라서 해당 따옴표를 추가하는 것은 확실히 옵션이 아닙니다.

이제 원래 스크립트로 돌아가서 첫 번째 줄을 다음으로 바꾸면

xs="foo/bar '*/*'"  # note additional single quotes

알겠습니다 -0 foo/bar -0 '*/*'(작은따옴표가 있으면 안 됩니다).

나는 따옴표와 백슬래시-별표 이스케이프의 모든 조합을 시도한 것 같으며 말 그대로 지금 무엇을 해야할지 전혀 모릅니다.

답변1

원본 스크립트를 사용했지만 첫 번째 줄에만 작은따옴표가 있었고 원하는 대로 작동했습니다( -0각 파일 경로 앞).

xs='foo/bar */*'

xs_cmd=""
for x in $xs; do
  xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd

파일 경로에 공백이 포함되어 있으면 사용 시 문제가 발생할 수 있습니다. 그렇다면 루프의 명령을 다음과 같이 변경하십시오.

  xs_cmd="$xs_cmd  -0 \"$x\" "

답변2

달성하려는 목표에 따라 다음 중 하나를 인용해야 합니다 */*.

xs="foo/bar '*/*'" #!

xs_cmd=""
for x in $xs ; do
    xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd
eval echo $xs_cmd
eval "echo $xs_cmd"

또는 배열을 사용하거나 둘 다를 사용합니다.

xs=("foo/bar" "*/*") #!

xs_cmd=""
for x in "${xs[@]}"; do
    xs_cmd="$xs_cmd  -0 '$x' " #!
done

echo "$xs_cmd"
eval "echo $xs_cmd"

관련 정보