it-swarm-vi.com

Lưu trữ đầu ra của lệnh trong biến Shell

Tôi có một thao tác sử dụng cut mà tôi muốn gán kết quả cho một biến

var4=echo ztemp.xml |cut -f1 -d '.'

Tôi nhận được lỗi:

ztemp.xml không phải là một lệnh

Giá trị của var4 không bao giờ được chỉ định; Tôi đang cố gắng gán cho nó đầu ra của:

echo ztemp.xml | cut -f1 -d '.'

Làm thế nào tôi có thể làm điều đó?

27
Vass

Bạn sẽ muốn sửa đổi bài tập của mình để đọc:

var4="$(echo ztemp.xml | cut -f1 -d '.')"

Cấu trúc $(…) được gọi là lệnh susbtlation .

39
Tok

Tùy thuộc vào Shell bạn đang sử dụng, bạn có thể sử dụng Mở rộng tham số. Chẳng hạn trong bash:

   ${parameter%Word}
   ${parameter%%Word}
          Remove matching suffix pattern.  The Word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a trailing portion of the expanded value of parameter, then  the
          result  of the expansion is the expanded value of parameter with
          the shortest matching pattern (the ``%'' case)  or  the  longest
          matching  pattern  (the ``%%'' case) deleted.  If parameter is @
          or *, the pattern removal operation is  applied  to  each  posi‐
          tional  parameter  in  turn,  and the expansion is the resultant
          list.  If parameter is an array variable subscripted with  @  or
          *,  the  pattern  removal operation is applied to each member of
          the array in turn, and the expansion is the resultant list.

Trong trường hợp của bạn, điều đó có nghĩa là làm một cái gì đó như thế này:

var4=ztemp.xml
var4=${var4%.*}

Lưu ý rằng ký tự # hành xử theo cách tương tự trên phần tiền tố của chuỗi.

Ksh, Zsh và Bash đều đưa ra một cú pháp khác, có lẽ rõ ràng hơn:

var4=$(echo ztemp.xml | cut -f1 -d '.')

Backticks (a.k.a. "Grave accent") không thể đọc được trong một số phông chữ. Cú pháp $(blahblah) ít nhất rõ ràng hơn rất nhiều.

Lưu ý rằng bạn có thể chuyển các giá trị thành một lệnh read trong một số shell:

ls -1 \*.\* | cut -f1 -d'.' | while read VAR4; do echo $VAR4; done
8
Bruce Ediger

Đây là một cách khác để gán một biến, tốt để sử dụng với một số trình soạn thảo văn bản không thể làm nổi bật chính xác mọi mã phức tạp bạn tạo.

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"
3
Aquarius Power