上記の問題の別の解決策は、各文字列を変数に設定し、リテラルのドル記号で示された変数を使用して関数を呼び出すこと\$
です。次に、関数を使用eval
して変数を読み取り、期待どおりに出力します。
#!/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
出力は次のとおりです。
string1 = firstString
string2 = second string with spaces
string3 = thirdString
これと同様の問題を解決しようとすると、UNIXの問題が発生し、変数がスペースで区切られていると思いました。パイプで区切られた文字列を関数に渡して、awk
後でレポートの作成に使用される一連の変数を設定しようとしました。私は最初にghostdog74によって投稿されたソリューションを試しましたが、すべてのパラメーターが引用符で渡されていなかったため、それを機能させることができませんでした。各パラメーターに二重引用符を追加すると、期待どおりに機能し始めました。
以下は、私のコードの変更前の状態で、変更後の状態で完全に機能します。
変更前-機能しないコード
#!/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
後-機能コード
#!/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