シェルスクリプトを使用して文字列から読み取った変数の解釈

シェルスクリプトを使用して文字列から読み取った変数の解釈

通常、複数の行を含むテキストファイルがあり、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

関連情報