Một giải pháp khác cho vấn đề trên là đặt từng chuỗi thành một biến, gọi hàm với các biến được biểu thị bằng ký hiệu đô la bằng chữ \$
. 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
Đầu ra là:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Khi cố gắng giải quyết một vấn đề tương tự như vậy, tôi đã gặp phải vấn đề về UNIX khi nghĩ rằng các biến của tôi bị phân định không gian. Tôi đã cố gắng truyền một chuỗi giới hạn đường ống đến một hàm bằng cách sử dụngawk
một loạt các biến sau này được sử dụng để tạo báo cáo. Ban đầu tôi đã thử giải pháp được đăng bởi ghostdog74 nhưng không thể làm cho nó hoạt động được 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 từng tham số, nó sẽ bắt đầu hoạt động như mong đợi.
Dưới đây là trạng thái trước mã của tôi và hoạt động đầy đủ sau trạng thái.
Trước - Mã không hoạt độ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 - Mã chức năng
#!/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