Bash에서 변수 대체의 백슬래시

Bash에서 변수 대체의 백슬래시

하드 드라이브를 올바르게 분할하는 데 도움이 되는 Bash 스크립트를 작성 중인데 변수에 숫자를 추가해야 하는 이상한 문제가 발생했습니다. 나는 Bash에 대한 경험이 많지 않기 때문에 올바른 결과를 얻는 데 시간이 좀 걸렸지만 임시적으로 뭔가를 할 수 있었습니다.

다음은 제가 구축하고 있는 작업의 예입니다.

#!/bin/bash

devName="/dev/sda"
devTarget=$devName\3

echo "$devTarget"

변수 devName는 이지만 /dev/sda나중에 스크립트에서 세 번째 파티션에 대한 변수도 설정해야 했기 때문에 표기법을 사용했습니다. \이를 통해 숫자를 추가하여 출력을 생성 3할 수 있었습니다./dev/sda/dev/sda3

표기법은 작동 하지만 \이것이 이와 같은 작업을 수행하는 올바른 방법인지 궁금합니다. Python에서는 따옴표 등의 다음 문자를 무시하는 데 사용되었기 때문에 이것을 사용하고 있지만 이 경우에는 그 반대를 수행하고 싶었기 때문에 놀랍게도 작동합니다. 이것이 변수를 추가하는 가장 좋은 방법이 아니라면 누군가 Bash에서 이를 수행하는 가장 좋은 방법의 예를 보여줄 수 있습니까?

답변1

문자열에 변수를 삽입하는 안전한 방법은 를 사용하는 것입니다 ${var_name}.

#!/bin/bash

devName="/dev/sda"
devTarget="${devName}3"

echo "$devTarget"

이런 식으로 Bash는 어떤 변수가 삽입되는지에 대해 의심하지 않습니다.

devTarget=$devName\3그런데 그게 어떻게 작동하는지 재밌네요 . 이유는 모르겠습니다.

답변2

$x\b동일한 방식으로 작동 $x"b"하거나 "$x"b변수 이름을 따옴표로 묶어서 작동합니다. 다른 이유가 없다면 변수가 확장될 때 따옴표가 여전히 남아 있고 \"'유효한 변수 이름이 없기 때문에 이런 일이 발생한다고 생각합니다.

이것표준 텍스트설명하다:

단어 확장 순서는 다음과 같습니다.

1. ..., 매개변수 확장(매개변수 확장 참조), ...

4. 견적 삭제(견적 삭제 참조)는 항상 마지막에 수행되어야 합니다.

그리고 "인용 제거"는 실제로 인용 문자를 제거하는 단계입니다.

하지만 @tomasz가 말했듯이그들의 대답에, 변수 이름을 중괄호 안에 넣는 것이 일반적이므로 "${x}b", 또는 입니다 "${devName}3". 거의 항상 확장자 주위에 따옴표를 붙이고 싶습니다.언제 큰따옴표가 필요합니까?

(그러나 실제로 따옴표 문자를 보존하는 것 외에 프로그램에서 따옴표 붙은 문자열을 표시하는 다른 방법이 있는지 궁금합니다.)

답변3

스크립트가 보여주는 것은 출력에 변수와 숫자를 쓰고 있다는 것입니다. 매우 간단합니다. printf형식 문자열을 사용하여 다음을 달성할 수 있습니다.

$ devName="/dev/sda"
$ printf "%s%d\n" "$devName" 3
/dev/sda3

하지만 말씀하신 것처럼사용-v스크립트 뒷부분의 새 변수를 사용하면 버전의 플래그를 활용할 수도 있습니다 .bashprintf

$ printf -v devTarget "%s%d" "$devName" 3
$ echo "$devTarget"
/dev/sda3

이 방법은 작동하지 않습니다POSIX-vprintf이며 다른 쉘에서는 작동하지 않습니다 (적어도 ksh 및 mksh에는 printf에 대한 플래그가 없으며 zhsh에 대해서는 확실하지 않습니다). 따라서 명령 대체를 통해 이 문제를 해결할 수 있습니다.

$ devTarget=$(printf "%s3" "$devName")

하지만, 그수락된 답변더 간단하고 휴대성이 더 좋을 수도 있습니다.

답변4

~처럼토마스는 지적했다, 변수 이름을 구성하는 문자를 정확하게 지정하는 올바른 방법은 중괄호를 사용하는 것입니다 ${devName}3.

Bash를 사용하면 편의를 위해 중괄호를 생략할 수 있지만 그렇게 하면 참조하는 변수에 대해 완전히 명시적인 기능을 잃게 됩니다. Bash가 이 문제를 해결하는 방법은 달러 기호로 시작하는 가장 긴 유효한 변수 이름을 사용하는 것입니다. 변수 이름은 문자나 밑줄로 시작하고 문자, 숫자, 밑줄을 얼마든지 포함할 수 있지만 다른 문자는 포함할 수 없습니다. 따라서 귀하의 예에서 $devName\3bash는 로 시작 d하고 찾을 수 있는 가장 긴 문자/숫자/밑줄 문자를 찾습니다 devName. 이는 사용할 변수의 이름 역할을 합니다. 마찬가지로, 이와 유사한 것은 이름이 지정된 변수를 $here-is-a-long-string-of-words사용합니다 here. 그것은 다음과 같을 것입니다 ${here}-is-a-long-string-of-words.

그런 다음 bash는 \3백슬래시가 다음 문자를 특별한 의미 없이 정상적으로 해석되도록 하는 인용 형식임을 확인합니다. 하지만 3어쨌든 특별한 의미는 없으므로 백슬래시는 중복됩니다. 이 시퀀스는 궁극적으로 별도의 시퀀스와 동일합니다 3.

관련 정보