Bash의 역참조

Bash의 역참조

나는 다음을 수행하기 위해 "우아한" 솔루션을 디자인하려고 합니다.

unzip applications/<abc>.zip -d applications/<abc>/
unzip applications/<def>.zip -d applications/<def>/
unzip applications/<ghi>.zip -d applications/<ghi>/
unzip applications/<jkl>.zip -d applications/<jkl>/

중괄호 확장은 적용되지 않습니다. 이는 내가 찾고 있는 것과 "반대"입니다(또는 뭔가 빠졌습니까?).

루프가 for갈 길입니까? 나는 과거 컨트롤(
무엇과 함께 xargs인수를 역참조하는 것 )을 사용하거나 활용하는 것에 대해 생각했지만 !:1상황은 빠르게 단순해지기보다는 복잡해졌습니다.

나는 정규식 역참조에 편향되어 있다고 생각합니다. 쉘에 비슷한 것이 있습니까?

답변1

일부 변수 확장 규칙이 있는 for 루프가 원하는 대로 작동할 수 있습니다.

for file in applications/*.zip
do
  unzip "$file" -d "${file%.zip}"
done

이 표현은 " ${file%.zip}끝에서 with의 내용을 제거한다"는 의미입니다.$file.zip

따라서 첫 번째 루프는 $file읽을 수 applications/abc.zip있으므로 ${file%.zip}읽습니다 applications/abc.

답변2

당신이 언급한 것 xargs. xargs 명령은 Thompson이나 Mashey 쉘이 for루프를 지원하지 않을 때 PWB/Unix에 나타났습니다. for귀하의 경우에는 루프가 가장 적합하다고 생각합니다 . 그러나 가능하면 프로그램에서 파이프를 사용하는 것이 우아하므로 xargs를 사용하여 이를 수행하는 방법은 다음과 같습니다.

printf "%s\n" abc def ghi jkl | xargs -I {} unzip applications/{}.zip -d applications/{}/

답변3

한 가지 가능성은 변수입니다. 이전/별도 명령에 할당하면 됩니다.

a=abc
unzip applications/"$a".zip -d applications/"$a"/
a=def
!unzip

답변4

예, for루프는 귀하의 작업에 훌륭한 솔루션입니다.

for i in abc def ghi jkl; do
    unzip applications/"$i".zip -d applications/"$i"/
done

또는 스크립트 대신 명령줄에서 사용하려면 한 줄에 동일한 명령을 사용하세요.

for i in abc def ghi jkl; do unzip applications/"$i".zip -d applications/"$i"/; done

예제의 값에는 따옴표가 $i필요하지 않지만 공백이나 기타 특수 문자가 포함된 값이 절대 없을 것이라고 확신하는 경우에는 따옴표를 사용하는 것이 좋습니다.

관련 정보