나는 지난 한 시간 동안 꽤 간단한 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"