Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash 및 셸 확장:지연 목록 작성

다시 올해의 시간입니다! 상점이 형형색색의 반짝이는 플라스틱 조각을 내놓기 시작하면 우리 모두는 약간 축제 분위기를 느끼기 시작합니다. 특히 명절 선물 쇼핑! (자신을 위한 선물은 기술적으로 여전히 선물입니다.)

이 모든 것이 완전히 미친 것은 아니므로 선물 목록을 만들어야 합니다. Bash가 도움이 될 수 있습니다.

중괄호 확장

다음은 중괄호가 아닙니다. ()

둘 다 다음과 같습니다. []

이것 중괄호:{}

중괄호는 Bash에게 그 사이에서 찾은 임의의 문자열로 작업을 수행하도록 지시합니다. 여러 문자열은 쉼표로 구분됩니다. {a,b,c} . 또한 각 확장 결과에 첨부할 선택적 서문 및 포스트스크립트를 추가할 수 있습니다. 일반적으로 이렇게 하면 일반적인 파일 경로 및 확장자와 같은 일부 입력을 줄일 수 있습니다.

우리가 물건을 주고 싶은 사람마다 목록을 만들어 봅시다. 다음 명령은 동일합니다.

touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists

/home/me/gift-lists
├── Amy.txt
├── Bryan.txt
└── Charlie.txt

이런, "Bryan"은 그의 이름을 "i"로 철자합니다. 고칠 수 있습니다.

mv /home/me/gift-lists/{Bryan,Brian}.txt

renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'

쉘 매개변수 확장

쉘 매개변수 확장을 통해 텍스트 조작 및 대체와 같이 중괄호로 묶인 매개변수에 대한 모든 종류의 변경을 수행할 수 있습니다.

우리의 모든 선물 받는 사람이 받을 자격이 있는 몇 가지 스타킹 스터퍼가 있습니다. 변수로 만들어 보겠습니다.

STUFF=$'socks\nlump of coal\nwhite chocolate'

echo "$STUFF"
socks
lump of coal
white chocolate

이제 tee의 도움을 받아 이러한 항목을 각 목록에 추가합니다. echo를 가져오는 명령 그리고 확장팩이 좋습니다.

echo "$STUFF" | tee {Amy,Brian,Charlie}.txt

cat {Amy,Brian,Charlie}.txt

socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate

패턴 일치 대체

다시 생각해보면, 석탄 덩어리는 그렇게 좋은 선물이 아닐 수도 있습니다. ${parameter/pattern/string} 형식의 패턴 일치 대체를 사용하여 더 나은 것으로 바꿀 수 있습니다. :

echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt

cat {Amy,Brian,Charlie}.txt

socks
candy cane
white chocolate
socks
candy cane
white chocolate
socks
candy cane
white chocolate

이것은 "석탄 덩어리"의 첫 번째 인스턴스를 "사탕 지팡이"로 대체합니다. 모든 인스턴스를 바꾸려면(여러 인스턴스가 있는 경우) ${parameter//pattern/string}을 사용합니다. . 이것은 $STUFF를 변경하지 않습니다. 나중에 나쁜 사람을 위해 원래 목록을 계속 재사용할 수 있습니다.

하위 문자열

개선하는 동안 선물 받는 사람이 모두 화이트 초콜릿을 좋아하지 않을 수 있습니다. 만일을 대비하여 목록에 일반 초콜릿을 추가하는 것이 좋습니다. 나는 매우 게으르므로 위쪽 화살표를 누르고 이전 Bash 명령을 수정하겠습니다. 운 좋게도 $STUFF의 마지막 단어는 변수는 9자 길이의 "초콜릿"이므로 ${parameter:offset}를 사용하여 해당 부분만 유지하도록 Bash에 지시하겠습니다. . tee를 사용하겠습니다. 의 -a a에 플래그 지정 내 기존 목록에 추가:

echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt

cat {Amy,Brian,Charlie}.txt

socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate

또한 다음을 수행할 수 있습니다.

이렇게 하세요 이것으로
n에서 부분 문자열 가져오기 문자 이후 ${parameter:n}
x의 하위 문자열 가져오기 n으로 시작하는 문자 ${parameter:n:x}

거기! 이제 기본 목록이 완료되었습니다. 에그노그를 먹자.

변수 테스트

에그노그일 수도 있지만 어제 Amy에 대한 목록을 시작하여 amy라고 하는 변수에 저장한 것 같습니다. . 내가 그랬는지 보자. ${parameter:?word}를 사용하겠습니다. 확장. word를 작성합니다. 표준 오류로 변경하고 amy가 없으면 종료 매개변수.

echo "${amy:?no such}"

bash: amy: no such

그렇지 않은 것 같아요. 브라이언이 아닐까?

echo "${brian:?no such}"

Lederhosen

또한 다음을 수행할 수 있습니다.

이렇게 하세요 이것으로
word 대체 if parameter 설정되지 않았거나 null입니다 ${parameter:-word}
word 대체 if parameter 설정되지 않았거나 null이 아닙니다. ${parameter:+word}
word 할당 parameter로 if parameter 설정되지 않았거나 null입니다 ${parameter:=word}

대소문자 변경

좋아요! Brian은 그가 약간의 lederhosen을 원한다고 말했고 그래서 나는 나 자신을 메모했다. 이것은 매우 중요하므로 ${parameter^^pattern}을 사용하여 Brian의 목록에 대문자로 추가하겠습니다. 확장. pattern 부분은 선택 사항입니다. 우리는 Brian의 목록에만 쓰고 있으므로 >>만 사용하겠습니다. tee -a 대신 .

echo "${brian^^}" >> Brian.txt

cat Brian.txt

socks
candy cane
white chocolate
chocolate
LEDERHOSEN

또한 다음을 수행할 수 있습니다.

이렇게 하세요 이것으로
첫 글자를 대문자로 ${parameter^pattern}
첫 글자를 소문자 ${parameter,pattern}
모두 소문자 ${parameter,,pattern}

배열 확장

이 모든 선물 목록 비즈니스는 많은 작업이 필요합니다. 매장에서 본 것들을 다양하게 만들어 보겠습니다.

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

${parameter:offset:length} 형식으로 부분 문자열 확장을 사용할 수 있습니다. 이것을 간단하게 만들기 위해. 처음 두 개는 Amy의 목록에 추가하고 중간 두 개는 Brian의 목록에 추가하고 마지막 두 개는 Charlie의 목록에 추가하겠습니다. printf를 사용하겠습니다. 줄 바꿈에 도움이 됩니다.

printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt
printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt
printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt

socks
candy cane
white chocolate
chocolate
sweater
gameboy

cat Brian.txt

socks
candy cane
white chocolate
chocolate
LEDERHOSEN
wagon
pillows

cat Charlie.txt

socks
candy cane
white chocolate
chocolate
chestnuts
hairbrush

거기! 이제 우리는 매우 개인화된 선물 목록의 포괄적인 세트를 가지고 있습니다. 감사합니다 배쉬! 우리를 위해 쇼핑을 할 수 없다는 것이 너무 아쉽습니다.