Bí danh nhiều dòng trong bash


13

Tôi có kịch bản sau đây. Đây là một trường hợp thử nghiệm đơn giản trong đó acó bất kỳ giá trị chuỗi nào và bđược coi là một đường dẫn.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

Tuy nhiên, bất cứ khi nào tôi cố gắng thực thi ./sample.sh, tôi gặp các lỗi sau:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

và khi tôi thử source sample.shtôi nhận được những điều sau đây:

a: Undefined variable.

Mục đích của tôi là biến nó thành một bí danh để tôi có thể tìm nguồn script này và chỉ chạy bí danh để thực thi dòng lệnh. Ai đó có thể nhìn vào điều này và cho tôi biết lỗi là gì không?


3
Khi bạn nghĩ rằng bạn cần bí danh đa dòng và nhiều lệnh, đã đến lúc xác định hàm hoặc tạo tập lệnh.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy lưu ý rằng
Jovin Miranda

Câu trả lời:


15

Bạn có một vài vấn đề ở đây

  1. Không giống như trong csh, trong bash(và các vỏ giống như Bourne khác), các bí danh được gán với một =dấu hiệu, ví dụalias foo=bar

  2. trích dẫn không thể được lồng nhau như thế; trong trường hợp này, bạn có thể sử dụng dấu ngoặc đơn xung quanh bí danh và dấu ngoặc kép bên trong

  3. dấu gạch chéo ngược \là ký tự tiếp tục dòng : về mặt cú pháp, nó làm cho lệnh của bạn thành một dòng duy nhất (ngược lại với những gì bạn muốn)

Vì thế

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Kiểm tra: đầu tiên chúng tôi nguồn tệp:

$ . ./myscript.sh

sau đó

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Nếu bạn muốn sử dụng bí danh trong một tập lệnh, thì hãy nhớ rằng các bí danh chỉ được bật theo mặc định trong các vỏ tương tác: để bật chúng trong một tập lệnh, bạn sẽ cần thêm

shopt -s expand_aliases

Bất kể mọi thứ ở trên, bạn nên xem xét sử dụng hàm shell thay vì bí danh cho những thứ như thế này


1
Một lý do khác để sử dụng các trích dẫn đơn xung quanh bí danh là các biến trong dấu ngoặc kép được mở rộng, do đó $a$bsẽ được mở rộng tại thời điểm xác định, không phải khi bí danh được thực thi.
Barmar

Cảm ơn về giải pháp, vấn đề ở đây là mặc dù tôi đã viết kịch bản do bạn đưa ra và khi tôi thực thi nó, tôi nhận được jo: lệnh không tìm thấy bí danh vì một số lý do không được đăng ký. Khi tôi lấy tệp thì tôi gặp lỗi này Chưa từng có ". Lý do duy nhất tôi làm bí danh và không hoạt động là vì tôi muốn gọi dòng mã này ở dòng lệnh và trong chức năng tôi không biết làm thế nào để đạt được điều đó. Tôi đã thấy lệnh gọi hàm thường nằm trong tập lệnh. Cách sử dụng bí danh chỉ để đảm bảo tôi có thể sử dụng nó như một hàm và gọi nó bất cứ khi nào tôi muốn
Jovin Miranda

Dù sao cũng đã sửa nó, tôi đã sử dụng shell mặc định là tcsh do đó vấn đề đã đến.
Jovin Miranda

8

Làm quen với việc sử dụng các hàm trong trình bao kiểu POSIX. Bạn không có bất kỳ vấn đề trích dẫn nào:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

Cảm ơn giải pháp, điều này đã làm việc khi tôi gọi hàm trong tập lệnh. Làm thế nào để tôi gọi hàm từ chính dòng lệnh, vì tôi có nhiều tập lệnh như vậy và muốn có một tình huống trong đó tôi viết tất cả các hàm trong một tệp nhưng thay vào đó gọi chúng từ dòng lệnh. Đó là toàn bộ lý do tôi đi tìm bí danh
Jovin Miranda

Nó giống hệt nhau. Đặt các chức năng trong một tệp và nguồn tệp đó
glenn jackman

có nó những gì tôi thực sự đã làm là sử dụng các nang. lệnh "$ @" để tôi có thể gọi tên hàm trong khi thực thi tệp
Jovin Miranda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.