2013-11-02 3 views
1

는 다음 코드이상한 변수 확장

function test1 
echo count:(count $argv) argv: $argv 
end 

function test2 
echo count:(count $argv) argv:$argv 
end 

test1 ci -m "test1 str2" 
test2 ci -m "test2 str2" 

이유는이 출력을 얻고을 고려하시기 바랍니다!

~  source test.fish         Sat Nov 2 12:18:26 EDT 2013 
count:3 argv: ci -m test1 str2 
count:3 argv:ci argv:-m argv:test2 str2 

두 번째 호출에서 argv : repetition에 유의하십시오.

답변

4

이 변수 확장하는 방법에 관한 감사드립니다. 변수가 하나 이상의 요소 (목록)를 포함하고 인수에 변수가 포함 된 경우 인수는 목록의 각 요소에 대해 별도로으로 확장됩니다.

예를 들어

: 그래서 샘플 코드에서

> set vals 1 2 3 
> echo item_$vals 
item_1 item_2 item_3 

: 이것은 $로 TEST1 함수를 호출

test1 ci -m "test1 str2" 

는 세 가지 요소의 목록으로 설정 ARGV : ci, -mtest2 str2.

echo argv: $argv 

스페이스 별도의 인수, 텍스트, 그래서 argv: $argv는 두 개의 분리 된 (확장되지 않은) 인수가 포함되어 있습니다. 그들은 별도로 확장됩니다. 두 번째 경우 지금

:

echo argv:$argv 

단지 하나 (팽창) 인수하므로 argv:$argv가 공백이없는 텍스트.

argv:$argv 
→ argv:{ci, -m, test2 str} 
→ argv:ci argv:-m argv:test2 str 

그 인수 후 에코 전달됩니다 따라서 물고기는 별도로 세 개의 인수를 산출, 목록에있는 모든 요소의 텍스트를 확장합니다.

이 확장 동작을 원하지 않으면 큰 따옴표를 사용하면 항상 단일 인수가됩니다. 큰 따옴표에서는 목록 변수가 공백을 사용하여 결합됩니다.

> set vals 1 2 3 
> echo "item_$vals" 
item_1 2 3 

따옴표 붙은 문자열은 공백을 포함하여 단일 인수로 확장됩니다.

완성도를 들어, 작은 따옴표는 완전히 변수 확장을 패배 :

> set vals 1 2 3 
> echo 'item_$vals' 
item_$vals 

인용 부호로 둘러싸이지 않은 그룹 확장 행동 패턴을 구성하는 데 유용합니다. file5.txt을 통해은 File2.txt의 목록을 생성하려면 : 물건을 지 웁니다

> echo file(seq 5).txt 
file1.txt file2.txt file3.txt file4.txt file5.txt 

희망을.