Câu hỏi bash script: chuyển đối số cho mkfs


Tôi đang viết một kịch bản bash để định dạng phân vùng của tôi. Một trong những lệnh mà tôi muốn chạy là:

mkfs.btrfs -f -m single -L root /dev/sda1

Vì vậy, tôi đã chia lệnh đó thành phần tùy chọn: -f -m single -L root  và phần phân vùng: /dev/sda1 và đặt chúng vào các biến như sau:

mkfs.btrfs "${myoptions}" /dev/"${mypartition}"

nhưng nó không thành công với:

mkfs.btrfs: invalid option -- ´ ´

Tôi đã thử các biến thể khác nhau của nó như đặt 2 phần trong ngoặc kép nhưng tất cả đều thất bại. Tôi cũng đã cố gắng để đưa hai phần vào một mảng và chạy nó như thế này:

mkfs.btrfs "${array[1]}" "${array[2]}"

hoặc như thế này:

mkfs.btrfs "${array[*]}"

nhưng nó cũng thất bại.

Nếu tôi chạy nó mà không có phần tùy chọn nó hoạt động, vì vậy tôi đoán là vấn đề xuất phát từ khoảng trống giữa hai đối số nhưng tôi không biết cách giải quyết nó.


0
2018-05-01 14:52


gốc


Bạn có thể chỉ định cách bạn đã chạy tập lệnh trên CLI không? Nó có thể chỉ là bạn phải đặt đối số của bạn trong dấu ngoặc kép. Giống như: $ script "-f -m single -L root" "sda1" - Gautam
Rõ ràng là không gian (tất cả chúng) như @Ignacio Vazquez-Abrams đã viết. - coverflower


Các câu trả lời:


Tôi cũng đã cố gắng đưa hai phần vào một mảng ...

Không đủ tốt. Mỗi đối số phải là một phần tử của một mảng (hoặc giá trị duy nhất trong biến).

args1=(-f -m single -L root)
args2=/dev/"$mypartition"
mkfs.btrfs "${args1[@]}" "$args2"

3
2018-05-01 14:56





Loại chuyện này luôn là nỗi đau lớn đối với tôi. Trong trường hợp này vì không có đối số nào của bạn có khoảng trắng, tôi sẽ cố gắng loại bỏ các dấu ngoặc kép và để Bash phá vỡ nó thành các từ cho $myoptions biến. Vì vậy, điều này:

mkfs.btrfs ${myoptions} /dev/"${mypartition}"

Với dấu ngoặc kép bạn có một trường, -f -m single -L root chứa khoảng trống. Không có nó, nó phải được chia thành các trường riêng lẻ -f  -m  single  -L và root và hiển thị cùng một hành vi khi nhập mkfs.btrfs -f -m single -L root /dev/sda1 trong trình bao tương tác.

Nếu bạn có một số đối số có chứa dấu cách, bạn có thể phải khéo léo với $IFS biến và mã hóa của bạn.

Bạn cũng có thể sử dụng biến đặc biệt $@ có quy tắc riêng.

Tôi viết tất cả các công cụ vỏ của tôi để POSIX mặc dù vậy tôi chắc chắn rằng có một cách dễ dàng hơn để làm điều này trong Bash.


0
2018-05-01 15:10



Tôi đã thử điều này: mkfs.btrfs $ {myoptions} / dev / "$ {mypartition}" một lần nữa nhưng nó không hoạt động. Tôi đã xem xét biến đặc biệt này $ @ nhưng nếu tôi không sai, nó cho các hàm bạn tự định nghĩa và không cho các hàm. - coverflower
Không bạn nói đúng, tôi nghĩ việc loại bỏ các dấu ngoặc kép sẽ làm việc trong trường hợp cụ thể này và đơn giản. $@ là một tham số đặc biệt bạn có thể bắt chước hành vi của một mảng với vì sh không có mảng. Thành thật mà nói, tôi viết kịch bản của mình sh tương thích vì tôi thích nó và nó được hỗ trợ trong tất cả các shell tương thích POSIX, bao gồm Bash. Nếu bạn quan tâm chỉ vì vui, etalabs.net/sh_tricks.html là một danh sách ngắn, được viết và trình bày về một số thủ thuật hữu ích hơn (bao gồm cả việc sử dụng $@). - BytePorter