Điểm:0

Làm cách nào để bạn chỉ định lại một đối số vị trí để nó có sẵn bên ngoài hàm?

lá cờ us

Tôi đang cố gắng tạo một hàm string_split tương thích #!/bin/sh có cú pháp lệnh tương tự như lệnh đọc để bạn có thể chuyển chuỗi bạn muốn tách và các biến bạn muốn gán chuỗi nữa.

Đây là chức năng tôi đã nghĩ ra, nhưng tôi không thể tìm ra cách làm cho các giá trị mới có sẵn bên ngoài chức năng như lệnh đọc có thể làm được.

#!/bin/sh
split_str() {
    input_ original=$1
    đầu vào=$1
    input_delimiter=$2

    đầu vào=$(echo "$input" | sed -e "s/$input_delimiter/ /g")
    đặt -- "$input_origin" "$input_delimiter" $input
}

Việc sử dụng lệnh mong muốn sẽ như thế này:

split_str "Xin chào thế giới" " " từ1 từ2
tiếng vang "$word1"
# Đầu ra: Xin chào
tiếng vang "$word2"
# Đầu ra: Thế giới

Dung dịch

Sử dụng câu trả lời bac0ns bên dưới, tôi có thể nhận được giải pháp này hoạt động với bất kỳ số lượng tham số đầu ra nào được thông qua. Cảm ơn đã giúp đỡ @bac0n

#!/bin/sh
split_str() {
    đầu vào=$1
    input_delimiter=$2
    
    # Cô lập các tham số đầu ra
    output_params=$(echo "${@}" | sed -e "s/$input $input_delimiter//g")

    # Thêm một đối số biến bổ sung để bắt bất kỳ lỗi tràn nào.
    # Điều này ngăn không cho bất kỳ phần bổ sung nào của chuỗi con được thêm vào
    # tham số đã truyền. 
    output_params="$output_params tràn"

    # Tách chuỗi bằng cách đọc các giá trị bằng read
    IFS="$input_delimiter" read -r $output_params << EOF
$1
EOF
}
kevincorrigan avatar
lá cờ us
@Terrance Bạn có thể mở rộng về điều đó không? Nếu tôi thêm return $input vào chức năng của mình, tôi sẽ gặp lỗi. "đối số số bắt buộc"
Terrance avatar
lá cờ id
Xin lỗi về điều đó, tôi sử dụng điều đó để trả về 0 hoặc 1 khi tôi gọi các hàm của mình nếu chúng đúng hoặc sai.
bac0n avatar
lá cờ cn
/bin/sh (dấu gạch ngang) có phải là một yêu cầu không?
kevincorrigan avatar
lá cờ us
@bac0n Có /bin/sh là bắt buộc.
Điểm:2
lá cờ cn

Các chức năng chạy trong cùng ngữ cảnh với trình bao hiện tại, hoàn toàn ổn khi đặt từ1từ2 bên trong hàm và sử dụng chúng từ phạm vi gọi:

tách ra(){
    cục bộ a=$1 b=$2
    ca 2
    IFS=$b đã đọc -r $@ _ << \
EOF
    $a
EOF
}

tách "xin chào thế giới" "" từ1 từ2

printf %s\n "1:$word1" "2:$word2"
kevincorrigan avatar
lá cờ us
Cảm ơn bạn! Đây không phải là chính xác những gì tôi cần nhưng nó chỉ cho tôi đi đúng hướng. Tôi sẽ cập nhật câu hỏi của mình với chức năng mới.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.