2011-01-29 41 views
5

tôi muốn viết kịch bản lệnh vỏ cá để tự động khởi tạo JAVA_HOME thành java-alternative được cấu hình hiện tại.Thao tác chuỗi trong vỏ cá

Trong bash nó sẽ trông như thế này (xin lỗi vì sự dirname đôi xấu xí)

j=`update-alternatives --query javac | grep Value:` 
JAVA_HOME=`dirname ${j#Value:}` 
JAVA_HOME=`dirname $JAVA_HOME` 
export JAVA_HOME 

những gì về cá?

set j (update-alternatives --query javac | grep Value:) 
set JAVA_HOME (dirname ${j#Value:}) <-- this won't work!! 
set JAVA_HOME (dirname $JAVA_HOME) 
set --export JAVA_HOME 
+0

Tôi từ chức chuỗi thao tác ủng hộ của bộ --export JAVA_HOME (update-alternatives --query javac | grep Value: | sed -e "s/Giá trị: //" | sed 's ,/* [^ /] \ +/* $ ,, '| sed' s,/* [^ /] \ +/* $ ,, ') – lrkwz

Trả lời

2

Bash:

j=$(update-alternatives --query javac | sed -n '/Value: /s///p') 
export JAVA_HOME=${j%/*/*} 

Cá:

set j (update-alternatives --query javac | sed -n '/Value: /s///p') 
set --export JAVA_HOME (dirname (dirname $j)) 

hoặc

set --export JAVA_HOME (dirname (dirname (update-alternatives --query javac | sed -n '/Value: /s///p'))) 
2

Thay vì sed, u có thể tận dụng expr với một regexp, ví dụ:

$ set a /path/to/some/folder/file.extension 

lệnh:

$ expr "//$a" : '.*/\([^.]*\)\..*$' 
file 

trích xuất các tập tin basename mà không mở rộng.

Xem man expr

0

Cá shell:

~> set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 
~> echo $JAVA_HOME 

Output (ví dụ):

/usr/lib/jvm/java-8-openjdk-amd64 

Cũng u có thể thêm vào ~/.config/fish/config.fish dòng này:

set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 

WBR

11

Vỏ cá bây giờ có lệnh dựng sẵn string để thao tác chuỗi. Điều này đã được thêm vào trong phiên bản 2.3.0 (tháng 5 năm 2016).

Ví dụ: trong trường hợp này, chúng ta có thể sử dụng để loại bỏ các string replaceValue: chuỗi:

set j (update-alternatives --query javac | grep Value: | string replace 'Value: ' '') 
set --export JAVA_HOME (dirname (dirname $j)) 

Có rất nhiều hơn string có thể làm. Từ string command documentation:

Synopsis 

string length [(-q | --quiet)] [STRING...] 
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] 
      [STRING...] 
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP 
      [STRING...] 
string join [(-q | --quiet)] SEP [STRING...] 
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] 
      [(-q | --quiet)] [STRING...] 
string escape [(-n | --no-quoted)] [STRING...] 
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
      [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...] 
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
       [(-q | --quiet)] PATTERN REPLACEMENT [STRING...] 
+0

Thật tuyệt vời! Nếu tôi muốn sử dụng kết quả của một cái gì đó giống như 'tách chuỗi" "" Đây là chuỗi thử nghiệm của tôi "' trong một biến danh sách, làm thế nào tôi sẽ làm điều đó? – rassoh

+1

@rassoh - Bằng cách ví dụ: 'đặt danh sách của tôi (tách chuỗi" "" Đây là chuỗi của tôi ")' – mattbh

+0

cảm ơn, hoạt động tuyệt vời! Tất nhiên, để làm cho nó một danh sách tôi đã phải làm 'set -l mylist (...)' – rassoh