Linux 쉘에서 %는 다음과 같이 무엇을합니까?
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
#
바로 왼쪽에 $
있고 %
바로 오른쪽에 있습니다. 니모닉이 필요하지 않습니다. (이것은 아마도 그 기호가 선택된 이유의 적어도 일부일 것입니다.)
Linux 쉘에서 %는 다음과 같이 무엇을합니까?
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
#
바로 왼쪽에 $
있고 %
바로 오른쪽에 있습니다. 니모닉이 필요하지 않습니다. (이것은 아마도 그 기호가 선택된 이유의 적어도 일부일 것입니다.)
답변:
%
패턴으로 사용 되면의 뒤로 삭제 된 항목 이 가장 짧은 ${variable%substring}
내용을 반환합니다 .variable
substring
variable
이 함수는 와일드 카드 패턴을 지원하므로 별 (별표)을 0 개 이상의 문자에 대한 대체 문자로 허용합니다.
이것은 Bash와 관련이 있으며 다른 Linux 쉘에는이 기능이 필요하지 않습니다.
Bash에서 문자열 조작에 대해 더 배우고 싶다면 읽는 것이 좋습니다. 이 페이지를 . 다른 편리한 기능 중-예를 들어- %%
수행하는 작업을 설명합니다 :)
편집 : 패턴으로 사용될 때 언급하는 것을 잊었습니다. $((variable%number))
또는 문자가 나머지 연산자의 기능을합니다. DavidPostill은 그의 답변에보다 구체적인 문서 링크를 가지고 있습니다.$((variable1%$variable2))
%
%
다른 상황에서 사용될 때는 일반 문자로만 인식해야합니다.
%
사용되는 또 다른 컨텍스트 는에 대한 형식 지정자입니다 printf
.
Bash 참조 매뉴얼 : Shell Parameter Expansion
${parameter%word}
${parameter%%word}
단어는 단지 파일 이름 확장에서 같은 패턴을 생성하기 위해 확장된다. 패턴이 확장 된 parameter 값의 후행 부분과 일치하면 확장 결과는 일치하는 가장 짧은 일치 패턴 ( 경우) 또는 삭제 된 가장 긴 일치 패턴 (경우)을 가진 parameter 의 값입니다 . 경우 파라미터 이다 또는 패턴 제거 동작이 차례로 각 위치 파라미터에인가되고, 팽창 얻어진리스트이다. parameter 가 or로 첨자 된 배열 변수 인 경우
‘%’
‘%%’
‘@’
‘*’,
‘@’
‘*’,
패턴 제거 작업이 배열의 각 멤버에 차례로 적용되고 확장이 결과 목록입니다.
실험을 통해 문자열이 중괄호 (중괄호)로 묶인 경우 % 이후의 일치 항목이 삭제됩니다.
설명하기 위해 :
touch abcd # Create file abcd
for file in ab*; do
echo $file # echoes the filename
echo $file% # echoes the filename plus "%"
echo ${file%} # echoes the filename
echo "${file%}" # echoes the filename
echo
echo "${file%c*}" # Discard anything after % matching c*
echo "${file%*}" # * is not greedy
echo ${file%c*} # Without quotes works too
echo "${file%c}" # No match after %, no effect
echo $file%c* # Without {} fails
done
출력은 다음과 같습니다.
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*
bash
)에서 어떤 기능을 수행 %
합니까?for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
이 특정 경우, %
는 패턴 일치 연산자입니다 ( 모듈러스 연산자 일 수도 있음 ).
$ {var % $ Pattern}, $ {var %% $ Pattern}
${var%$Pattern}
백엔드와 일치$var
하는 가장 짧은 부분을 제거 합니다 .$Pattern
$var
${var%%$Pattern}
$var
의 가장 긴 부분 에서 의$Pattern
백엔드와 일치하는 부분을 제거하십시오$var
.예 : 매개 변수 대체에서 패턴 일치
#!/bin/bash # patt-matching.sh # Pattern matching using the # ## % %% parameter substitution operators. var1=abcd12345abc6789 pattern1=a*c # * (wild card) matches everything between a - c. echo echo "var1 = $var1" # abcd12345abc6789 echo "var1 = ${var1}" # abcd12345abc6789 # (alternate form) echo "Number of characters in ${var1} = ${#var1}" echo echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c') echo "--------------" echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789 # Shortest possible match, strips out first 3 characters abcd12345abc6789 # ^^^^^ |-| echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789 # Longest possible match, strips out first 12 characters abcd12345abc6789 # ^^^^^ |----------| echo; echo; echo pattern2=b*9 # everything between 'b' and '9' echo "var1 = $var1" # Still abcd12345abc6789 echo echo "pattern2 = $pattern2" echo "--------------" echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a # Shortest possible match, strips out last 6 characters abcd12345abc6789 # ^^^^ |----| echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a # Longest possible match, strips out last 12 characters abcd12345abc6789 # ^^^^ |-------------| # Remember, # and ## work from the left end (beginning) of string, # % and %% work from the right end. echo exit 0
소스 매개 변수 대체
%
모듈로 또는 mod (정수 나누기 연산의 나머지를 반환)
bash$ expr 5 % 3 2
5/3 = 1, 나머지 2
소스 연산자
.*
과 %
는 반면, 비 욕심을 정의 %%
차종은 욕심? 그래서 실제로 이름 바꾸기 예 그것은 중요하지 여부 사용에 수행 %
또는 %%
그러나이 있다면 mv "$file" "${file%.*png.jpg}.jpg"
단지에있는 모든 파일의 이름을 바꿀 것 %%를 사용합니다 (*주의) .jpg
, 맞죠?
$Pattern
변수 $Pattern
가 정의되지 않았기 때문에 "Remove ... the shortest of the shortest "는 잘못되었습니다 . 또는 " $var
를 수행 할 때 "Pattern "텍스트 만 제거됩니다 . 어쩌면 이것은 오타 일 수도 있지만 tldp.org의 또 다른 예입니다. BashGuide 또는 Bash Hackers Wiki 는 모두 imho를 훨씬 잘 참조합니다. ${var%Pattern}
${var%%Pattern}
%%
거나 또는를 검색##
하여 올바른 섹션을 빨리 찾을 수있을 정도로 기억하기 어렵습니다.man bash
/##