Một giải pháp cho vấn đề trên là để thiết lập mỗi chuỗi cho một biến, cuộc gọi hàm có các biến được ký hiệu bằng ký hiệu đô la theo số \$
. Sau đó, trong hàm sử dụng eval
để đọc biến và đầu ra như mong đợi.
#!/usr/bin/ksh
myFunction()
{
eval string1="$1"
eval string2="$2"
eval string3="$3"
echo "string1 = ${string1}"
echo "string2 = ${string2}"
echo "string3 = ${string3}"
}
var1="firstString"
var2="second string with spaces"
var3="thirdString"
myFunction "\${var1}" "\${var2}" "\${var3}"
exit 0
Output là sau đó:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Trong cố gắng để giải quyết một vấn đề tương tự như sau, tôi đã chạy vào vấn đề của UNIX suy nghĩ của tôi đã biến không gian delimeted. Tôi đã cố gắng để vượt qua một chuỗi phân cách đường ống đến một chức năng sử dụng awk
để thiết lập một loạt các biến sau đó được sử dụng để tạo ra một báo cáo. Ban đầu tôi đã thử các giải pháp được đăng bởi ghostdog74 nhưng không thể làm cho nó hoạt động vì không phải tất cả các tham số của tôi đều được thông qua trong dấu ngoặc kép. Sau khi thêm dấu ngoặc kép vào mỗi tham số, nó bắt đầu hoạt động như mong đợi.
Dưới đây là trạng thái trước của mã của tôi và hoạt động hoàn toàn sau trạng thái.
Trước - Non Mã chức năng
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Error Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Does Not Work Since There Are Not Quotes Around The 3
iputId=$(getField "${var1}" 3)
done<${someFile}
exit 0
Sau - chức năng Mã
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Now Works As There Are Quotes Around The 3
iputId=$(getField "${var1}" "3")
done<${someFile}
exit 0
trình cho tôi ... Tôi sử dụng cú pháp đầy đủ cho các chức năng mặc dù" chức năng bla () {echo $ 1; } ", không thể viết ngắn gọn thành một lớp lót. Không chắc chắn nó tạo nên sự khác biệt. Phiên bản bash nào? – Eugene
thử' echo "$ @" 'hoặc' cho i trong "$ @"; echo echo $ i; Việc này được đề cập rất rõ ràng trong tất cả các tài liệu 'bash' trong phần' tham số vị trí'. – Samveen
Tôi đã gặp vấn đề tương tự, cố chuyển một chuỗi được trích dẫn thành tham số và chỉ là chuỗi đầu tiên từ của chuỗi được công nhận là một phần của tham số. Đề xuất của Samveen thay đổi $ 1 thành $ @ làm việc cho tôi. Lưu ý rằng tôi chỉ chuyển một tham số cho hàm, nhưng nếu tôi chuyển nhiều hơn bằng câu lệnh for sẽ có –