通常、複数の行を含むテキストファイルがあり、whileループを使用して行を「印刷」したいと思います。このファイル内のテキストには変数が含まれています。問題は、これらの変数がスクリプト内に格納された変数を含む同様のテスト文字列とは異なるように解釈されることです。私の外部ファイルでもこれらの変数を解釈できますか?それとも事前に解析する必要がありますか?$LINE_INSIDE
これらとそしての違いは何ですか$LINE_OUTSIDE
?引用符付きの他の構造など、他の質問でいくつかの提案を試しましたが、${!varialbe_name}
これまで運はありません。
#!/bin/bash
# color.sh
BLUE='\033[1;34m'
NC='\033[0m' # No Color
LINE_INSIDE="${BLUE}Blue Text${NC}"
echo -e ${LINE_INSIDE}
while read LINE_OUTSIDE; do
echo -e ${LINE_OUTSIDE}
done < text_file
出力:
追加情報:入力テキストファイルに実行しないでくださいシェルコマンドもあります。変数のみを拡張する必要があります。
答え1
次のように書く方が合理的かもしれません。
BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
eval "cat << EOF
$(<text_file)
EOF
"
while read
ループを使うより(ところで、これは行を読む正しい構文ではありません。)。
もちろん、これはその中のコードが解釈されるという意味です。たとえば、そこにあるAは再$(reboot)
起動を引き起こしますが、これはユーザーが要求するものとは多少違いがあります。
また、行が含まれていないとtext_file
仮定しますEOF
。
別のアプローチはただgettext
変数(環境変数)置換(たとえば、コマンド置換ではない)を実行すると、GNUの次のものが使用されますenvsubst
。
BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst < text_file
または、次の2つの変数を展開してください。
BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst '$BLUE$NC' < text_file
答え2
最新バージョンbash
(バージョン4.4から始まる)には、完全に実行することなく文字列の変数を間接的に拡張する別の賢い方法がありますeval
。@P
ヒント、変数置換を含むがこれらに限定されない)。
$ cat file.txt
${BLUE}hello blue${NORM}
$ BLUE=$'\e[34m'
$ NORM=$'\e[m'
$ while IFS= read -r line; do printf '%s\n' "${line@P}"; done < file.txt
hello blue