出力からこのスクリプトの「for」内容を取得したいと思いますKW0_TEXT
。KW1_TEXT
#!/bin/sh
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
echo ${str}_TEXT
eval echo ${str}_TEXT
done
これまでの出力結果は次のとおりです。
KW0_TEXT
KW0_TEXT
KW1_TEXT
KW1_TEXT
答え1
/bin/sh が実際に /bin/bash の場合、変数間接参照を使用できます。
#!/bin/bash
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
var=${str}_TEXT
printf "%s\n" "${!var}"
done
答え2
/bin/sh が実際に /bin/bash でバージョンがかなり新しい場合は、連想配列を使用できます。
#!/bin/bash
strs=( KW0 KW1 )
declare -A text=(
[KW0]="text text text"
[KW1]="text text text text"
)
for str in "${strs[@]}"; do
printf "%s\t%s\n" "$str" "${text[$str]}"
done
KW0 text text text
KW1 text text text text
答え3
問題は、使用法$
にテキストが欠落していることですeval
。変数を置き換えた後に評価するコマンドは次のとおりです。
echo KW0_TEXT
しかし、あなたは欲しい
echo $KW0_TEXT
それが必要です:
eval echo '$'${str}_TEXT
ただし、これをサポートするシェルを使用している場合は、Jeff Schallerの間接変数アプローチがより優れています。